我应该一次触发多少个 IO 绑定异步任务?
How many IO bound async tasks should I fire at once?
我正在向 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());
}
}
如果同时打开上千个连接,当然会有性能瓶颈。这么大的请求,我觉得不能无限制地处理。
可以考虑使用SemaphoreSlim
我正在向 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());
}
}
如果同时打开上千个连接,当然会有性能瓶颈。这么大的请求,我觉得不能无限制地处理。
可以考虑使用SemaphoreSlim