Я запускаю команды на 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, это ~ 16 тысяч подключений каждые 2 минуты.
Спасибо, ребята, не могли бы вы, ребята, предложить способ достижения оптимальной производительности, я не могу протестировать на тысячах устройств. Можем ли мы иметь надежное предположение о числе, которое может обеспечить безопасность за счет производительности?
В чем смысл await firstFinishedTask;? По определению вы знаете, что он уже завершен, иначе WhenAny полностью сломан.
Дело в том, что async не означает, что вы сделаете больше работы. Это означает, что вы можете запускать больше заданий, чем синхронным способом. Просто измерьте производительность





Есть только один способ ответить на этот вопрос, и это проверить его. Это будет зависеть от слишком многих факторов, многие из которых, вероятно, неизвестны, пока вы их не обнаружите, чтобы дать здесь надежный ответ.