HttpWebRequest的并发限制我正在写一个应用程序来测量我使用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()这样的异步方法?如果您使用的是.net4.0,您可能想试试这段代码。基本上,我使用Tasks在特定站点上发出1000个请求(我使用它在我的开发机器上对应用程序进行负载测试,我认为没有限制,因为我的应用程序快速连续地看到这些请求)publicpartialclassForm1:Form{publicForm1(){初始化组件();}privatevoidbutton1_Click(objectsender,EventArgse){for(inti=0;i{if(t.Exception==null){using(varsr=newStreamReader(t.Result.GetResponseStream())){字符串str=sr.ReadToEnd();}}elseSystem.Diagnostics.Debug.WriteLine(t.Exception.InnerException.Message);});}}}publicstaticclassWebRequestExtensions{publicstaticTaskGetReponseAsync(这个WebRequest请求){returnTask.Factory.FromAsync(request.BeginGetResponse,request.EndGetResponse,null);由于此处的工作负载受I/O限制,因此无需生成线程即可完成工作,这实际上可能会损害性能。使用WebClient类上使用Async方法的I/O完成端口,因此性能更高,资源占用更少。您应该使用BeginGetResponse方法,它不会阻塞并且是异步的。在处理I/O绑定异步时,仅仅因为您生成一个线程来执行I/O工作,该线程仍将被阻塞以等待硬件(在本例中为网卡)响应。如果使用内置的BeginGetResponse,线程将在NIC上排队,然后可以做更多的工作。硬件完成后,它会通知您,此时您的回调将被调用。我想澄清一下,BeginGetResponse方法不是完全异步的:(来自MSDN)BeginGetResponse方法需要完成一些同步设置任务(例如DNS解析、代理检测和TCP套接字连接),然后该方法才会变为异步。因此,永远不应在用户界面(UI)线程上调用此方法,因为它可能需要一些时间,通常是几秒钟。以上就是C#学习教程《HttpWebRequest之并发限制分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
