HttpClient中有多少个连接

时间:2018-07-11 12:40:38

标签: c# dotnet-httpclient

背景

我必须从互联网上下载大约16,000个文档和同样数量的html页面。这个数字将来会增加。目前,我只是使用Parallel.ForEach来并行下载和处理数据。但是,这似乎并没有充分利用我的资源,因此我计划发挥async/await的作用,以使尽可能多的下载异步运行,但我可能必须对此加以限制。

实际问题

一个HttpClient可以有几个打开的连接?创建如此大量的连接时,我还必须牢记哪些其他因素?我知道我应该重用相同的HttpClient,并且我也读过this answer,但是我怀疑我真的可以一次打开数十亿个连接。

1 个答案:

答案 0 :(得分:3)

首先,从Parallel.ForEach切换到async/await的好选择。通过摆脱线程约束,您可以将并发性提高几个数量级。

  

我怀疑我是否真的可以一次打开数十亿个连接。

假设您可以。您是否认为这项工作的完成速度比您一次拥有1000个职位要快?首先要遇到的限制是带宽(或服务器可能拒绝请求),而不是并发连接。因此,我建议,如果您的目标是尽快完成工作,那么您一次可以打开的最大连接数甚至不相关。

也就是说,.NET有默认限制。假设您使用的是完整框架或.NET Core 2.x,则可以通过ServicePointManager.DefaultConnectionLimit以编程方式更改该限制,其默认值仅为2。将其设置为更大的值。

接下来,我建议使用SemaphoreSlim或TPL Dataflow设置您的代码以同时执行下载,并达到一定的限制。 this question的答案都很好地涵盖了这两种方法。然后开始实验,直到得出一个最佳数字。很难说那是什么。也许从50开始。如果进展顺利,将其增加到100,然后查看整体作业是否完成得更快。如果您开始收到套接字异常或服务器返回的错误,请向下拨。