c# - HttpClient 中有多少个连接

标签 c# dotnet-httpclient

背景

我必须从 Internet 下载大约 16k 个文档和相同数量的 html 页面。 future 这个数字还会增加。目前我只是使用 Parallel.ForEach 并行下载和处理数据。然而,这似乎并没有充分利用我的资源,所以我计划让 async/await 发挥作用,尽可能多地异步运行下载,但我可能不得不限制它。

真题

单个 HttpClient 可以打开多少个连接?创建如此多的连接时,我还必须牢记哪些其他因素?我知道我应该重用相同的 HttpClient 并且我还阅读了 this answer ,但我怀疑我真的可以同时打开数十亿个连接。

最佳答案

首先,关于从 Parallel.ForEach 切换到 async/await 的良好调用。通过摆脱线程的限制,您将能够按数量级提高并发性。

I have doubts that I can really have several billion connections open at once.

假设您可以。你认为这项工作会比你同时打开 1000 个工作更快地完成吗?您首先要遇到的限制是带宽(或者可能是服务器拒绝请求),而不是并发连接。因此,如果您的目标是尽快完成工作,我建议您一次可以打开的最大连接数甚至都不重要。

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

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

关于c# - HttpClient 中有多少个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51285724/

相关文章:

C# Polly 结合了在 HttpClient 内部使用的 http 错误处理程序、重试、舱壁和超时

c# - 每个服务端点的 HttpClient 实例

c# - 使用成员表进行代码优先建模

c# - 无法将扩展方法添加到 C# 中的抽象类

c# - HttpClient 未在登台服务器上使用缓存

c# - 无法在单元测试中访问已处置的对象

.net - 使用 HttpClient,如何将 XDocument 直接保存到请求流?

c# - 检查字符串是否经过 xxx 位散列

c# - 防止 Web API 方法被调用

c# - 在 Controller 外部访问 session 状态