簡體   English   中英

HttpWebRequest的並發限制

[英]Concurrency Limit on HttpWebRequest

我正在編寫一個應用程序來測量我使用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#編寫的高速網絡爬蟲的例子?

您是否嘗試過使用諸如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);
    }
  }

由於此處的工作負載受I / O限制,因此不需要生成線程來完成工作,實際上可能會損害性能。 使用WebClient類上的Async方法使用I / O完成端口,因此性能更高,資源更少。

您應該使用BeginGetResponse方法,該方法不會阻塞並且是異步的。

處理I / O綁定異步時,僅僅因為您生成一個線程來執行I / O工作,該線程仍然會被阻塞,等待硬件(在這種情況下是網卡)響應。 如果您使用內置的BeginGetResponse,那么該線程將只在網卡上排隊,然后可以進行更多的工作。 硬件完成后,它會通知您,此時將調用您的回調。

我想說明BeginGetResponse方法並非完全異步:(來自MSDN

在此方法變為異步之前, BeginGetResponse方法需要完成一些同步設置任務(例如,DNS解析,代理檢測和TCP套接字連接)。 因此,永遠不應在用戶界面(UI)線程上調用此方法,因為它可能需要一些時間,通常為幾秒鍾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM