Подтвердить что ты не робот

Async/ждет и параллель в С#

Когда следует использовать async/wait и когда следует использовать parallel.foreach в С#? Являются ли параллельные и асинхронные/ожидающие выполнение одной и той же цели? Каковы различия в них?

4b9b3361

Ответ 1

async/await - это асинхронность, а Parallel.ForEach - parallelism. Они связаны понятиями, но не то же самое.

Parallel.ForEach используется, когда вы хотите выполнить одну и ту же операцию для всех элементов в коллекции параллельно, блокируя текущий поток до тех пор, пока все операции не будут завершены.

async/await используется, когда текущая операция не может продвинуться дальше, пока не завершится конкретная асинхронная операция, но вы не хотите блокировать текущий поток. Это особенно полезно в двух ситуациях:

  • Написание кода, который в основном запускает различные асинхронные операции, один за другим, в потоке пользовательского интерфейса, мгновенно доступ к интерфейсу между операциями. (Это более общее, чем это, но это простой пример.) Вы не хотите блокировать поток пользовательского интерфейса, но управление всеми этими асинхронными операциями является болью иначе.
  • Обработка большого количества длительных операций за один раз - например. на веб-сервере. Каждый отдельный запрос может занять много времени из-за вызова в другую веб-службу, базы данных и т.д., Но вы не хотите иметь один поток для каждого запроса, поскольку потоки являются относительно дорогим ресурсом.

Вы можете объединить parallelism и асинхронность, отпустив новую задачу, которая вызовет Parallel.ForEach, а затем ждет эту задачу. (Как один пример.)