为什么要限制并发异步I / O操作的数量?

时间:2019-07-13 18:00:45

标签: c# asynchronous

如果我必须同时对某个URL进行100次异步查询。 我的代码如下:

var tasks = requests.Select(x => httpClient.GetStringAsync(x)).ToList();
return Task.WhenAll(tasks);

我应该关心并发调用的限制吗?这意味着,不要同时创建100个任务,而要分块完成。关于这个主题的好文章是here

我更喜欢依靠ServicePointManager.DefaultConnectionLimit。 Windows操作系统限制出站连接的数量。看here。 因此,我正在创建100个任务,并且其中只有10个(默认为DefaultConnectionLimit)并行运行。

How to limit the amount of concurrent async I/O operations?的启发。

1 个答案:

答案 0 :(得分:2)

是的,您应该关注并发调用的限制;但仅根据用例。

底线:这取决于您的基础结构。

例如,如果您使用共享网络连接;从不同来源获取大量数据可能会阻塞您的网络。

另一个例子:在较大的块中,同时连接较少的情况下,写入网络服务器可能会更有效。

根据运行的位置,有必要知道正在执行多少个并行任务。

如果知道这一点,则可以在环境范围内对其进行调整以使其合理。这取决于硬件和可能的负载。...

这基本上是article中的意思,

  

最佳连接数取决于应用程序运行的实际条件。增加应用程序可用的连接数可能不会影响应用程序性能。为了确定更多连接的影响,请在更改连接数的同时运行性能测试。

如上所述,HttpWebRequest的默认值非常低。即使在家庭/消费者互联网连接上,这也将导致一个很好的“通用方法”场景。如果您的情况是:例如高性能服务器到服务器的通信,那么使用不同的值会更有意义。

关键是要了解环境/上下文及其功能。

然后,您可以确定大量的并行操作。

这就是为什么您必须关心它,有时会限制它的原因:-)