Представьте, что у меня есть IAsyncEnumerable, где каждый Request представляет собой какое-то входящее сообщение, которое я хочу обработать, но я не хочу ждать завершения каждого обработчика сообщений перед перемещением. переход к следующей итерации/сообщению; Я хочу, чтобы как можно больше сообщений обрабатывалось «одновременно».
Могу ли я использовать простую перегрузку метода Parallel.ForEachAsync (без указания максимального количества потоков, чтобы делегировать обработку всего этого самому фреймворку)?
По сути, я этого не хочу:
Код: Выделить всё
await foreach (var request in requests) // `requests` is an `IAsyncEnumerable`
{
await Handle(request); // I don't want to await here
}
Могло бы вместо этого сделать это? Или это проблематично (например, потенциально может исчерпать пул потоков или перегрузить системные ресурсы)? Или есть какой-то лучший подход?
Код: Выделить всё
await Parallel.ForEachAsync(requests, async (request, ct) =>
{
await Handle(request);
});
Обновление: Parallel.ForEachAsync кажется плохим вариантом, поскольку он ограничивает количество параллельных вызовов обработчика количеством ядер ЦП хост-машины.
>
Подробнее здесь:
https://stackoverflow.com/questions/791 ... oreachasyn