【发布时间】: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