Как ограничить степень параллелизма при обработке набора асинхронных задач?

Для ограниченной конкурентности используйте SemaphoreSlim, пул потребителей или Parallel.ForEachAsync с MaxDegreeOfParallelism. Один Task.WhenAll ограничение не вводит.

Короткий ответ

Что ответить на собеседовании

Для ограниченной конкурентности используйте SemaphoreSlim, пул потребителей или Parallel.ForEachAsync с MaxDegreeOfParallelism. Один Task.WhenAll ограничение не вводит.

Подробный разбор

Ответ с пояснениями

Для ограниченной конкурентности используйте SemaphoreSlim, пул потребителей или Parallel.ForEachAsync с MaxDegreeOfParallelism. Один Task.WhenAll ограничение не вводит.

Пример для .NET 6+:

await Parallel.ForEachAsync(items,
    new ParallelOptions {
        MaxDegreeOfParallelism = 4,
        CancellationToken = cancellationToken
    },
    async (item, ct) => await ProcessAsync(item, ct));

Одновременно выполняется не более четырёх тел итерации. Для очень большого потока заданий bounded Channel позволяет также ограничить очередь и память. Лимит подбирают по ограничениям зависимости и измерениям, а не обязательно по числу ядер для I/O. Это ограничение конкурентности, не rate limit запросов в секунду.

Источник: learn.microsoft.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее