gpt4 book ai didi

c# - HttpWebRequest 的并发限制

转载 作者:太空狗 更新时间:2023-10-29 17:45:23 26 4
gpt4 key购买 nike

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

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

然后我发现 GetResponse() 方法会阻止所有其他进程的访问,直到 WebResponse 关闭:http://www.codeproject.com/KB/IP/Crawler.aspx#WebRequest ,我没有在网上找到任何其他信息来支持这一说法,但是我使用套接字实现了一个 HTTP 请求,我注意到速度有了显着提高(4 倍到 6 倍)。

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

最佳答案

您是否尝试过使用 BeginGetResponse() 等异步方法?

如果您使用的是 .net 4.0,您可能想试试这段代码。本质上,我使用 Tasks 在特定站点上发出 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 完成端口,因此性能更高,资源消耗更少。

关于c# - HttpWebRequest 的并发限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com