我正在多线程环境中调用Web服务。我的很多调用由于操作超时或错误请求而失败,但如果我以线性方式执行,则没有一个调用会失败,这意味着使用多个线程调用 Web 服务存在问题。经过大量分析,我发现并发连接的限制导致了这些异常,因此我通过添加以下代码来修复它。
ServicePointManager.DefaultConnectionLimit = 2 * _ThreadCount;
我不知道增加这个限制可能带来的缺点。默认情况下,连接限制为 2。如果有人知道任何缺点,请告诉我。
MSDN 说:
更改 DefaultConnectionLimit 属性 对现有连接没有影响 服务点对象;它只影响 ServicePoint 对象 更改后初始化。如果该房产的价值尚未 直接设置或通过配置设置,该值默认 为常量 DefaultPersistentConnectionLimit。
和
注意
对 DefaultConnectionLimit 属性的任何更改都会影响 HTTP 1.0 和 HTTP 1.1 连接。无法单独更改 HTTP 1.0 和 HTTP 1.1 协议的连接限制。当用于 服务器环境 (ASP.NET) DefaultConnectionLimit 默认为 更高的连接数,即 10。
不,除了你的AppDomain会消耗更多资源之外,不应该有任何缺点。但就你而言,这是微不足道的。
事实上,它实际上可以帮助您使用更少的资源(内存),因为挂起的请求在 ServicePoint 内部排队。请阅读此处了解更多信息:并行发送 HTTP 请求数小时后 ServicePoint 对象的大小
让我给你图片......我有大约 46K 任务,这些任务以 100 个为一批运行(每个任务将调用 webservice),所以我有 100 个线程同时调用 webservice。这还是微不足道的吗?还是会对我的情况产生一些影响?
当然会有影响。但影响取决于很多因素。每个主机都有一个服务点。
如果您的任务主要针对同一主机,请将
DefaultConnectionLimit
增加到更大的值(当前执行批次中的预期任务数)。
如果您主要针对不同的主机发出请求,那么问题中的限制效果很好。
关于资源的使用,只要您的服务器不是很忙于其他应用程序,就可能没问题。