2016-01-21 138 views
2

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

ServicePointManager.DefaultConnectionLimit = 2 * _ThreadCount; 

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

回答

1

MSDN说:

更改DefaultConnectionLimit财产对现有 的ServicePoint对象没有影响;它仅影响在更改后初始化的ServicePoint对象 。如果此属性的值不是 已直接或通过配置设置,则该值默认 为常量DefaultPersistentConnectionLimit。

到DefaultConnectionLimit属性的任何变化都影响HTTP 1.0和HTTP 1.1连接。无法单独更改HTTP 1.0和HTTP 1.1协议的连接限制。当 服务器环境(ASP.NET)DefaultConnectionLimit默认使用 更高的连接数,这是10

+0

MSDN还指出,默认值为MaxValue的,但是当我调试我看到默认值为2 – Viru

+0

@Viru: - 是的,它是默认设置为MaxValue的。你确定以前没有改变过吗? –

+0

在我的应用程序或配置无论在哪里,我设置此值,但如果我正确地undertstand它,它是系统级配置,有可能是在machine.config中的配置,我没有检查....反正,我更感兴趣在寻找任何可能的弊端 – Viru

1

不,不应该有比你的AppDomain会消耗更多的资源以外的任何缺点。但在你的情况下,这是微不足道的。

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

让我给你的图片....我有大约46K的任务,这些任务都在批100(每个任务将调用Web服务),所以我跑了有100个线程调用webserivce同时。它仍然微不足道?或者它会对我的情况产生一些影响?

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

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

如果你主要是针对不同的主机做请求,你的问题的限制工作正常。

关于资源的使用情况,只要您的服务器并不是非常忙于其他应用程序就可能。

+0

让我给你的图片....我有大约46K的任务,这些任务都在批100跑(每个任务将调用Web服务),所以我有100个线程同时调用webserivce。它仍然微不足道?或者它会对我的情况产生一些影响? – Viru

+0

@Viru:阅读我的更新。 – jgauffin

+0

你的意思是在这种情况下说同一个主机? 如果你的任务大多是针对不同的主机上,增加DefaultConnectionLimit到一个较大的值(预计在当前执行批处理任务数)。 如果你是做多是针对不同主机的请求,在你的问题的极限工作正常。 – Viru