HttpWebRequest的并发限制

Kam*_*eld 9 .net c# multithreading httpwebrequest httpwebresponse

我正在编写一个应用程序来测量我使用C#下载网页的速度.我提供了一个唯一域名列表,然后我生成X个线程并执行HTTPWebRequests,直到消耗了域列表.问题是无论我使用多少线程,我每秒只能获得大约3页.

我发现System.Net.ServicePointManager.DefaultConnectionLimit是2,但我的印象是这与每个域的连接数有关.由于列表中的每个域都是唯一的,因此这不应成为问题.

然后我发现GetResponse()方法阻止来自所有其他进程的访问,直到关闭WebResponse:http://www.codeproject.com/KB/IP/Crawler.aspx#WebRequest,我还没有找到任何关于web支持这个声明,但我使用套接字实现了一个HTTP请求,我注意到了一个显着的加速(4x到6x).

所以我的问题是:有没有人确切知道HttpWebRequest对象是如何工作的?除了上面提到的内容之外还有解决方法吗?还是有任何用C#编写的高速网络爬虫的例子?

Shi*_*mar 8

您是否尝试过使用诸如BeginGetResponse()之类的异步方法?

如果您使用的是.net 4.0,则可能需要尝试此代码.基本上我使用任务在特定站点上发出1000个请求(我使用它在我的开发机器上对应用程序进行负载测试,我看到没有限制,因为我的应用程序快速连续看到这些请求)

  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      for (int i = 0; i < 1000; i++)
      {
        var webRequest = WebRequest.Create(textBox1.Text);
        webRequest.GetReponseAsync().ContinueWith(t =>
        {
          if (t.Exception == null)
          {
            using (var sr = new StreamReader(t.Result.GetResponseStream()))
            {
              string str = sr.ReadToEnd();
            }
          }
          else
            System.Diagnostics.Debug.WriteLine(t.Exception.InnerException.Message);
        });
      }
    }
  }

  public static class WebRequestExtensions
  {
    public static Task<WebResponse> GetReponseAsync(this WebRequest request)
    {
      return Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
    }
  }
Run Code Online (Sandbox Code Playgroud)

由于此处的工作负载受I/O限制,因此不需要生成线程来完成工作,实际上可能会损害性能.使用WebClient类上的Async方法使用I/O完成端口,因此性能更高,资源更少.