Выбор ответа Middle Потоки и синхронизация обновлено

Parallel.ForEach для HTTP-запросов

Вопрос

Нужно скачать 1000 страниц с ограничением 10 одновременных запросов. Что выбрать в .NET 8?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Parallel.ForEachAsync с MaxDegreeOfParallelism = 10. Parallel.ForEachAsync (.NET 6+) поддерживает асинхронное тело и ограничение степени параллелизма.

Варианты ответа

  1. Parallel.ForEach с .Result внутри тела цикла
  2. Parallel.ForEachAsync с MaxDegreeOfParallelism = 10правильный ответ
  3. Task.WhenAll по всем 1000 задачам сразу без ограничений
  4. 1000 вызовов new Thread(...) с ожиданием через Join

Разбор

Parallel.ForEachAsync (.NET 6+) поддерживает асинхронное тело и ограничение степени параллелизма. Parallel.ForEach рассчитан на синхронную CPU-работу, а .Result внутри заблокирует потоки пула. WhenAll без ограничения запустит 1000 запросов сразу и может упереться в лимиты сервера. Потоки ОС на каждый запрос дороги и бесполезны для I/O. Альтернатива: SemaphoreSlim с WhenAll.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме