怎样做多任务处理

keanulaw 2008-12-03 05:32:38
我需要在程序中可以同时处理多个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)之类的东东呢,这方面不太懂,大家帮帮我啊!

...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jedliu 2009-05-20
  • 打赏
  • 举报
回复
没做过类似的东西,但原理都一样!
建议你看下迅雷的下载策略!
http://bbs.ghtt.net/thread-82218-1-1.html

其他的也不错,可以看下!
keanulaw 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hongzao 的回复:]
为了防止请求过多而造成阻塞,可以在一个PoolManager类中硬编码线程数为10或20之类的,或定义个函数由其他函数指定线程数.
然后提供几个接口。
1. GetInstanceOfPort() 在线程池中得到一个可用的线程供执行Request. 如果此时所有的线程都在工作,那么可以让线程Sleep一秒或更多。然后重新尝试得到一个可用的线程。
2. ReturnInstanceOfPort() 把用完的线程返回给线程池。一般是执行完Request才会调用。不过在执行Request时可…
[/Quote]
那我直接用ThreadPool不是更好么,毕竟我不用冒险去做线程管理,以防止出现意外!
hongzao 2008-12-04
  • 打赏
  • 举报
回复
为了防止请求过多而造成阻塞,可以在一个PoolManager类中硬编码线程数为10或20之类的,或定义个函数由其他函数指定线程数.
然后提供几个接口。
1. GetInstanceOfPort() 在线程池中得到一个可用的线程供执行Request. 如果此时所有的线程都在工作,那么可以让线程Sleep一秒或更多。然后重新尝试得到一个可用的线程。
2. ReturnInstanceOfPort() 把用完的线程返回给线程池。一般是执行完Request才会调用。不过在执行Request时可能出错抛异常时,应该catch住,执行完一些处理后也该调用这个函数。
然后每执行一个Request都通过这个PoolManager来执行。具体这么实现这几个函数,就随便了。
只是一点建议。各位高手多批评阿!
keanulaw 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 patrickpan 的回复:]
3000 * 3 / (60 * 60) = 2.5小时,系统等待的时间都有2.5个小时,呵呵。
减少Sleep时间,改用多线程试试。
[/Quote]
ThreadPool就是执行多线程的吧,其他的我不熟悉,能告诉我还有其他方法么?
keanulaw 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shalen520 的回复:]
异步请求吧,然后自己编程实现超时机制,避免长期等待而引起工作线程阻塞;有些代理响应相当的慢

btw,你这东西看起来像是用来刷票或者刷流量的东西...
[/Quote]
ThreadPool的QueueUserWorkItem方法其实就是后台的异步请求方法!
你说的代理响应问题倒是个大问题,我现在实现的方法是Request的时候显示TimeOut缩短请求时间。

BTW,恰恰相反,我的东西是删Spam用的!
wangping_li 2008-12-03
  • 打赏
  • 举报
回复
限制下请求时间
jinsuo_1986 2008-12-03
  • 打赏
  • 举报
回复
UP 关注
patrickpan 2008-12-03
  • 打赏
  • 举报
回复
3000 * 3 / (60 * 60) = 2.5小时,系统等待的时间都有2.5个小时,呵呵。
减少Sleep时间,改用多线程试试。

shalen520 2008-12-03
  • 打赏
  • 举报
回复
异步请求吧,然后自己编程实现超时机制,避免长期等待而引起工作线程阻塞;有些代理响应相当的慢

btw,你这东西看起来像是用来刷票或者刷流量的东西...
优途科技 2008-12-03
  • 打赏
  • 举报
回复
up下。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧