我需要在程序中可以同时处理多个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.   

    异步请求吧,然后自己编程实现超时机制,避免长期等待而引起工作线程阻塞;有些代理响应相当的慢btw,你这东西看起来像是用来刷票或者刷流量的东西...
      

  2.   

    3000 * 3 / (60 * 60) = 2.5小时,系统等待的时间都有2.5个小时,呵呵。
    减少Sleep时间,改用多线程试试。
      

  3.   

    ThreadPool的QueueUserWorkItem方法其实就是后台的异步请求方法!
    你说的代理响应问题倒是个大问题,我现在实现的方法是Request的时候显示TimeOut缩短请求时间。BTW,恰恰相反,我的东西是删Spam用的!
      

  4.   

    ThreadPool就是执行多线程的吧,其他的我不熟悉,能告诉我还有其他方法么?
      

  5.   

    为了防止请求过多而造成阻塞,可以在一个PoolManager类中硬编码线程数为10或20之类的,或定义个函数由其他函数指定线程数.
    然后提供几个接口。
    1. GetInstanceOfPort() 在线程池中得到一个可用的线程供执行Request. 如果此时所有的线程都在工作,那么可以让线程Sleep一秒或更多。然后重新尝试得到一个可用的线程。
    2. ReturnInstanceOfPort() 把用完的线程返回给线程池。一般是执行完Request才会调用。不过在执行Request时可能出错抛异常时,应该catch住,执行完一些处理后也该调用这个函数。
    然后每执行一个Request都通过这个PoolManager来执行。具体这么实现这几个函数,就随便了。
    只是一点建议。各位高手多批评阿!
      

  6.   

    那我直接用ThreadPool不是更好么,毕竟我不用冒险去做线程管理,以防止出现意外!
      

  7.   

    没做过类似的东西,但原理都一样!
    建议你看下迅雷的下载策略!
    http://bbs.ghtt.net/thread-82218-1-1.html其他的也不错,可以看下!