连续发出多个Web请求的最简单方法是什么?

时间:2010-02-01 18:54:14

标签: c# .net visual-studio multithreading

我有一个给定的URL列表,我创建一个HTTP Web请求对象,并尝试连接它,我有一个url的'数组',我尝试连接每个。目标是看出哪些是出局的。

它已经可以工作了,但是一个请求只在最后一个请求结束时才开始,所以它的工作速度很慢,大约每秒两个请求。

我想知道我是否应该让5个线程在后台工作,这将使它快5倍,这是所需的速度(不会超载共享的互联网频段)。但我有两个问题:

1 - 我甚至不知道它是否是我问题的最佳解决方案。 2 - 我已经尝试了一些,但我是.NET框架的新手,并且从未使用过多线程。所以我不知道我会怎么做。

我有一个函数start(),它有一个For,它遍历所有url的检查存在。

数据:VS 08,.NET 3.5,C#。

- [编辑] -

任何人都可以告诉我(如果可能,使用代码示例)如何在backgroundworker中使用五个(尽可能多的)线程?在最后一次处理结束后立即开始呢?

4 个答案:

答案 0 :(得分:3)

研究BackgroundWorker对象。这将允许您生成多个线程工作程序来实例化异步Web请求。然后只需使用ReportProgress方法报告每个请求的状态。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://dotnetperls.com/backgroundworker

答案 1 :(得分:1)

这是.NET中BackgroundWorker类的理想情况。它利用线程池在后台执行可能长时间运行的操作,因此调用者不必处理单独的线程创建代码。

答案 2 :(得分:0)

我更喜欢创建一个执行HttpWebRequest的worker类,并在每个连接的自己的线程中启动它。让您的worker类使用回调方法来表示它已完成。我使用挂起线程队列和活动线程字典。由于可重新启动的事情(例如连接失败和超时)而过早完成的线程可以放回队列中。线程的ManagedThreadId可以方便地跟踪线程。

您可能还希望通过将此添加到app.config来增加应用的最大连接数:

  <system.net>
    <connectionManagement>
      <remove address="*"/>
      <add address="*" maxconnection="10" />
    </connectionManagement>
  </system.net>

我选择10作为示例 - 您必须尝试查看对吞吐量,CPU利用率和内存使用的影响。

答案 3 :(得分:0)

不是自己显式启动新线程,而是使用 HttpWebRequest.BeginGetResponse()方法异步执行每个请求,并指定回调方法:

http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/

请记住在回调方法中调用 response.Close(),以便不会超出最大并发连接数。这比增加app.config的 maxconnection 值更可取,这是违反RFC准则(最大连接数= 2)。

作为一个粗略的指南,我可以使用这种方法在5秒内每秒执行大约8个请求。