【问题标题】:How many IO bound async tasks should I fire at once? [closed]我应该一次触发多少个 IO 绑定异步任务? [关闭]
【发布时间】:2026-02-24 04:25:06
【问题描述】:

我正在向 IP 摄像机发出命令,大约有数千个,代码和网络请求在 ConnectCam 方法中。 我使用以下模式使用 Task.WhenAny() 一次性触发它们。 这有任何潜在的瓶颈吗?我应该限制请求吗?

List<Task> tasks = deviceList.Select(x => ConnectCamAsync(ct, x.IpAddress, x.UserName, x.PassWord)).ToList();
       var orgCount = tasks.Count();
           while (tasks.Count() > 0)
            {
                ct.ThrowIfCancellationRequested();
                try
                {
                    var firstFinishedTask = await Task.WhenAny(tasks);

                    tasks.Remove(firstFinishedTask);

                    await firstFinishedTask;
                }
                finally
                {
                    UpdateProgress(0, orgCount, orgCount - tasks.Count());
                }
            }

【问题讨论】:

  • 只有一种方法可以回答这个问题,那就是测试它。这将取决于太多因素,其中许多因素在您发现它们之前可能是未知的,以便能够在此处提供可靠的答案。
  • 这个问题的答案与许多因素有关,包括所有中间网络设备的缓冲/排队/内存管理。如果您对网络的打击太大,上游设备完全有可能断开连接。有什么限制?你需要自己找出答案。
  • 此外,如果您在连接的 TIME_WAIT 时间段之前使用的临时端口数量超过了最大临时端口,那么访问数以千计的单独地址将使您面临端口饥饿的风险。 IIRC 每 2 分钟有约 16k 个连接。
  • 谢谢,伙计们,你们能否提出一种实现最佳性能的方法,我无法在数千台设备上进行测试。我们能否安全地猜测一下这个数字,它可以以牺牲性能为代价来确保安全。
  • await firstFinishedTask; 的意义何在?根据定义,您知道它已经完成,否则 WhenAny 完全损坏。

标签: c# async-await task-parallel-library


【解决方案1】:

如果同时打开数千个连接,当然会出现性能瓶颈。我不认为这么多请求可以不受限制地处理。

可以考虑使用SemaphoreSlim

【讨论】:

    最近更新 更多