日期:2014-05-17  浏览次数:20994 次

关于HttpWebRequest并发的纠结问题,请各位帮助
假设Winform程序所在的机器带宽足够,CPU、内存配置相当。

业务处理:顺序的执行HTTP请求和一系列的数据处理(例如:向服务器A发送HTTP请求后,等待返回数据,处理返回的数据后,再向服务器B发送请求,然后接收返回数据,再对返回的数据进行处理……,直到返回最终数据处理结果)。

问题1
需要开 500 到 1000 个“线程”来做业务处理,每个线程处理的HTTP请求数量和处理的数据量可能不同,完成任务时间长短可能不同。想要实现 500 到 1000 个“线程”同时开始 并发的执行应该怎么做比较合理呀?

问题2
如果将以上实现的功能封装成DLL,导出一个方法,调用时,传入2个参数:
1.HTTP请求地址(可以是多个)
2.回调函数

每调用一次DLL就自动开一个线程来做业务处理,接收数据由回调函数来完成。

请问这该如何实现呀?

谢谢各位的帮助。

------解决方案--------------------


        private void btn_Open_Click(object sender, EventArgs e)
        {
            int n = 5 //线程数
            openThread = new Thread[n];//为线程申请资源,确定线程总数
            ThreadStart startOpenThread = new ThreadStart(Open); //运行方法
            for (int i = 0; i < n; i++)//开启指定数量的线程数
            {
                openThread[i] = new Thread(startOpenThread);//指定线程起始设置
                openThread[i].Name = "openThread" + i.ToString();
                openThread[i].IsBackground = true;
                openThread[i].Start();//逐个开启线程
                Thread.Sleep(10);
            }
        }


void Open()
        {
//你要做的事情
}



------解决方案--------------------
问题1
需要开 500 到 1000 个“线程”来做业务处理,每个线程处理的HTTP请求数量和处理的数据量可能不同,完成任务时间长短可能不同。想要实现 500 到 1000 个“线程”同时开始 并发的执行应该怎么做比较合理呀?

To 14楼,您确定您运行过你的代码吗?
 openThread = new Thread[n];//为线程申请资源,确定线程总数
将这个N设置到500或者1000看看... ...
创建/销毁线程不需要开销吗?
"小型网站也许直接就被你弄的瘫痪了。"
不,你先弄瘫痪的是你自己的进程,挤爆你的CPU... ...

To Lz: "开 500 到 1000 个“线程”来做业务处理",如果你是指 System.Treading.Thread
这个前提是有问题的假设.不是开500到1000个线程来做业务,而是怎么样更好有效的利用你的硬件/软件资源.
管理你的线程池,具体多少个线程合理要看环境配置.并不是越多越好.


弄清楚第一个问题,再谈第二个问题.