增加ServicePointManager.DefaultConnectionLimit的缺点

时间:2016-01-21 11:33:32

标签: c# .net multithreading web-services

我在多线程环境中调用Web服务。很多我的调用由于操作超时或错误的请求而失败,但是如果我以线性方式执行调用则没有调用失败,这意味着调用具有多个线程的webservice存在问题。经过大量的分析,我发现并发连接的限制导致了这些异常,所以我通过添加下面的代码来修复它。

 ServicePointManager.DefaultConnectionLimit = 2 * _ThreadCount;

我不知道增加此限制的可能缺点。默认情况下,连接限制为2.如果有人知道任何缺点,请告诉我。

3 个答案:

答案 0 :(得分:2)

MSDN说:

  

更改现有的DefaultConnectionLimit属性无效   ServicePoint对象;它只影响ServicePoint对象   更改后初始化。如果此属性的值没有   直接或通过配置设置,值默认   到常量DefaultPersistentConnectionLimit。

  

注意

     

对DefaultConnectionLimit属性的任何更改都会影响HTTP   1.0和HTTP 1.1连接。无法单独更改HTTP 1.0和HTTP 1.1协议的连接限制。用于   服务器环境(ASP.NET)DefaultConnectionLimit默认为   更高的连接数,即10。

答案 1 :(得分:1)

不,除了您的AppDomain将消耗更多资源之外,不应存在任何其他缺点。但在你的情况下,它是微不足道的。

事实上,它实际上可以帮助您使用更少的资源(内存),因为挂起的请求在ServicePoint内部排队。请阅读此处以获取更多信息:Big size of ServicePoint object after several hours sending HTTP request in parallel

  

让我给你一张照片....我有大约46K的任务,这些任务是100批次运行的(每个任务都会调用webservice)所以我有100个线程同时调用webserivce。它仍然是微不足道的吗?或者它会对我的情况产生一些影响吗?

它当然会产生影响。但影响取决于许多因素。服务点是每个主机。

如果您的任务主要针对同一主机,请将DefaultConnectionLimit增加到更大的值(当前执行批处理中的预期任务数)。

如果您主要针对不同的主机提出请求,则问题的限制可以正常工作。

关于资源的使用,只要您的服务器不是很忙于其他应用程序,它就可能很好。

答案 2 :(得分:0)

您还应该意识到,它可能在另一端伤害您。 如果您给要调用的Web服务增加了很大的负担,则可能会出现节流黑名单的情况。例如,请参见此blog