当前位置: 首页 > 编程语言 > C#

用c#多线程处理大量web请求share

时间:2023-04-10 16:41:01 C#

c#多线程处理大量web请求sharepoint对象模型)。Web请求适用于此,但一次执行一个请求(发送请求、等待响应、重复)相当慢。我决定对请求进行多线程处理,试图加快处理速度。该程序已大大加快,但一段时间后(1-2分钟左右),开始抛出并发异常。代码如下,这是最好的方法吗?信号量锁=新信号量(10,10);列表文件夹路径列表=newList();//folderPathListpopulatedforeach(stringfolderPathinfolderPathList){Lock.WaitOne();新线程(委托(){WebRequestrequest=WebRequest.Create(folderPath);request.Credentials=DefaultCredentials;request.Method="MKCOL";WebResponseresponse=request.GetResponse();response.Close();Lock.Release();})。开始();}for(inti=1;i<=10;i++){Lock.WaitOne();异常是这个未处理的异常:System.Net.WebException:无法连接到远程服务器->System.Net.Sockets.SocketException:通常每个套接字地址只允许使用一次192.0.0.1:81atSystem.Net.SocketsSystem.Net.Sockets.Socket.InternalConnect(EndPointremoteEP)在System.Net.ServicePoint.ConnectSocketInternal(BooleanconnectFailure,Sockets4,Sockets6,Socket&socket,IPAddress&address,ConnectSocketState状态,IAsyncResultasyncResult,Int32超时,异常&例外)您可能会创建太多连接,用完所有可以使用的本地端口关闭端口后超时,然后才能重新使用端口。WebRequest为您隐藏了所有低级套接字处理,但我猜它最终会耗尽端口,或者尝试(重新)绑定到已经处于TIME_WAIT状态的套接字。即使您不关心响应,也请务必阅读响应流。这应该有助于不会产生太多延迟的连接。WebResponse响应=request.GetResponse();新的StreamReader(response.GetResponseStream()).ReadToEnd();我会从这里粘贴一些相关信息:当连接关闭时,在关闭连接的一侧,五元组{协议,本地IP,本地端口,远程IP,远程端口}进入TIME_WAIT状态240秒默认情况下。在这种情况下,协议是固定的——TCP本地IP、远程IP和远程端口通常也是固定的。所以变量是本地端口。发生的情况是,当您不绑定时,将使用1024-5000范围内的端口。粗略地说,您有4000个端口。如果你在4分钟内使用它们——这意味着每4秒大约有16个Web服务调用,你将用完所有端口。这就是这个例外的原因。好的,现在该怎么办?其中一种方法是增加动态端口范围。默认情况下,最大值为5000。您可以将其设置为65534。HKLM系统CurrentControlSet服务Tcpip参数MaxUserPort是使用的关键。你可以做的第二件事是一旦连接进入TIME_WAIT状态,你可以减少它停留在该状态的时间,默认是4分钟,但是你可以将这个设置为30秒HKLMSystemCurrentControlSetServicesTcpip参数TCPTimedWaitDelay是使用钥匙。将此设置为30秒,您不会关闭webrequests,这可能会导致连接长时间打开。这听起来像是Parallel.Net的Parallel.Foreach的完美工作,只需确定您希望它运行多少个线程ParallelOptionsparallelOptions=newParallelOptions();parallelOptions.MaxDegreeOfParallelism=10;Parallel.ForEach(folderPathList,parallelOptions,folderPathList=>{using(WebRequestrequest=WebRequest.Create(folderPath)){request.Credentials=DefaultCredentials;request.Method="MKCOL";GetResponserequest=WebRequest.Create(folderPath);请求.Credentials=DefaultCredentials;请求.Method="MKCOL";使用(WebResponseresponse=request.GetResponse());}});另一件要记住的事情是maxConnections,一定要在app.config中设置它:在实际场景中你必须添加try-catch和重试可能超时的连接,导致代码更复杂。对于这种IO密集型任务,异步编程模型非常有用。但是,在C#中使用它有点困难。C#现在也支持异步语言了,你可以试试CTP版的。试试这个folderPathList.ToList().ForEach(p=>{ThreadPool.QueueUserWorkItem((o)=>{WebRequestrequest=WebRequest.Create(p);request.Credentials=DefaultCredentials;request.Method="MKCOL";WebResponse=request.GetResponse();response.Close();});编辑–不同的webrequest方法以上是C#学习教程:Multithreadinginc#handlesalargenumberofWebrequests.分享所有内容,如果有用大家和需要了解更多C#学习教程,希望大家多多关注—folderPathList.ToList().ForEach(p=>{ThreadPool.QueueUserWorkItem((o)=>{using(WebClientclient=newWebClient()){client.Credentials=DefaultCredentials;client.UploadString(p,"MKCOL","");}});});本文整理自网络,不代表立场,如涉及侵权,请点击右上角联系管理员删除,如需转载请注明出处: