C#用Parallel.Foreach发Web服务请求速率远低于SOAPUI求解决方案
问题原因
- 默认HTTP并发连接数限制:.NET Framework 对同一域名的默认HTTP并发连接数限制为2,该配置出自
ServicePointManager.DefaultConnectionLimit的默认值,直接限制了对外请求的并发上限,是导致速度慢的核心原因。 - Parallel.Foreach 适用场景不匹配:Parallel 类是为CPU密集型任务设计的,默认并行度受CPU核心数限制,且调度逻辑偏向计算任务优化,而HTTP请求属于IO密集型任务,阻塞等待IO返回的过程会浪费线程资源,也会拉低实际并发量。
- 默认HTTP协议配置开销:.NET 默认为HTTP请求开启了
Expect: 100-continue握手、Nagle算法、自动系统代理检测等特性,额外增加了单请求的耗时。
优化建议
- 调整全局/指定域名的并发连接上限,在程序启动入口处添加如下配置:
// 全局所有域名的并发连接上限调整为100,可根据实际需求调整数值 ServicePointManager.DefaultConnectionLimit = 100; // 也可单独针对目标服务域名设置,避免影响其他请求 var targetServicePoint = ServicePointManager.FindServicePoint(new Uri("你的Web服务根地址")); targetServicePoint.ConnectionLimit = 100;
- 替换Parallel.Foreach为异步IO并发方案:HTTP请求属于IO密集型任务,使用异步+
Task.WhenAll的方案可以大幅提升并发效率,同时建议全局单例复用HttpClient实例,避免频繁创建销毁带来的端口资源浪费。 - 关闭不必要的HTTP特性减少开销:
// 关闭100-continue握手,减少一次网络往返 ServicePointManager.Expect100Continue = false; // 关闭Nagle算法,降低小数据包的发送延迟 ServicePointManager.UseNagleAlgorithm = false; // 若无需系统代理,可关闭代理检测 var handler = new HttpClientHandler() { UseProxy = false }; var httpClient = new HttpClient(handler);
- 若仍要使用Parallel.Foreach,显式指定更高的并行度:
Parallel.ForEach(请求列表, new ParallelOptions { MaxDegreeOfParallelism = 50 }, 单个请求处理逻辑);
内容的提问来源于stack exchange,提问作者Mohannad Asha
相关产品推荐
相关产品推荐

