我需要在程序中可以同时处理多个HttpWebRequest请求。我现在使用的是ThreadPool,这么做对计算机资源的消耗是比较少的,但看起来速度不够快,代码类似于下面这样:
1 private void StartRequest()
2 {
3 foreach (string url in requestedUrlList)
4 {
5 ThreadPool.QueueUserWorkItem(new WaitCallback(ExcuteMethod), url);
6 }
7 }
8
9 private void ExcuteMethod(object state)
10 {
11 if (state != null)
12 {
13 string currentUrl = state.ToString();
14 foreach (string proxy in proxies)
15 {
16 WebProxy myProxy = new WebProxy(proxy);
17
18 HttpWebRequest requestSite = WebRequest.Create(currentUrl) as HttpWebRequest;
19 requestSite.Proxy = myProxy;
20
21 using (HttpWebResponse resSite = requestSite.GetResponse() as HttpWebResponse)
22 {
23 //When finished, sleep for a while
24 ...
25 }
26 }
27 }
28 }
上面的代码主要想做到:对于同一个作为Proxy的IP,可以同时处理多个URL,处理URL成功后Thread.Sleep大概3秒左右。但现在如果有3000个作为Proxy的IP同时执行20条URL时,需要至少5个小时!这可能和网速也有点关系,但也太慢了点。各位老大,谁能给我出个主意,怎么提高速度呢,是不是需要搞点多进程(Multiple processes)之类的东东呢,这方面不太懂,大家帮帮我啊!
1 private void StartRequest()
2 {
3 foreach (string url in requestedUrlList)
4 {
5 ThreadPool.QueueUserWorkItem(new WaitCallback(ExcuteMethod), url);
6 }
7 }
8
9 private void ExcuteMethod(object state)
10 {
11 if (state != null)
12 {
13 string currentUrl = state.ToString();
14 foreach (string proxy in proxies)
15 {
16 WebProxy myProxy = new WebProxy(proxy);
17
18 HttpWebRequest requestSite = WebRequest.Create(currentUrl) as HttpWebRequest;
19 requestSite.Proxy = myProxy;
20
21 using (HttpWebResponse resSite = requestSite.GetResponse() as HttpWebResponse)
22 {
23 //When finished, sleep for a while
24 ...
25 }
26 }
27 }
28 }
上面的代码主要想做到:对于同一个作为Proxy的IP,可以同时处理多个URL,处理URL成功后Thread.Sleep大概3秒左右。但现在如果有3000个作为Proxy的IP同时执行20条URL时,需要至少5个小时!这可能和网速也有点关系,但也太慢了点。各位老大,谁能给我出个主意,怎么提高速度呢,是不是需要搞点多进程(Multiple processes)之类的东东呢,这方面不太懂,大家帮帮我啊!
解决方案 »
- 如何定制个性化 界面的安装包?
- 求助:金额格式的转换(三位一撇)
- 急等版主和高手!!!!一个让人头痛的SQL Server与datagrid问题
- 最后85分全给了,只想求达人给个意见,用电子商务客户流失分析做硕士毕业论文可行吗?关系到小妹的人生呀,来者有分·······
- Web service接口函数如何保证互斥调用??
- 请问怎样将dateTimePicker里的日期显示中,指定的日期变成灰色或禁掉?
- {}有没有winform局域网下点到点文件传输的程序源码下载?
- 批量声明类
- 请问怎样变成绘制窗口的标题栏?
- 不错,不错!
- 菜人提问两个问题
- 怎么使用mshtml 中的getElementsByName
减少Sleep时间,改用多线程试试。
你说的代理响应问题倒是个大问题,我现在实现的方法是Request的时候显示TimeOut缩短请求时间。BTW,恰恰相反,我的东西是删Spam用的!
然后提供几个接口。
1. GetInstanceOfPort() 在线程池中得到一个可用的线程供执行Request. 如果此时所有的线程都在工作,那么可以让线程Sleep一秒或更多。然后重新尝试得到一个可用的线程。
2. ReturnInstanceOfPort() 把用完的线程返回给线程池。一般是执行完Request才会调用。不过在执行Request时可能出错抛异常时,应该catch住,执行完一些处理后也该调用这个函数。
然后每执行一个Request都通过这个PoolManager来执行。具体这么实现这几个函数,就随便了。
只是一点建议。各位高手多批评阿!
建议你看下迅雷的下载策略!
http://bbs.ghtt.net/thread-82218-1-1.html其他的也不错,可以看下!