Когда следует использовать async/wait и когда следует использовать parallel.foreach в С#? Являются ли параллельные и асинхронные/ожидающие выполнение одной и той же цели? Каковы различия в них?
Async/ждет и параллель в С#
Ответ 1
async/await - это асинхронность, а Parallel.ForEach
- parallelism. Они связаны понятиями, но не то же самое.
Parallel.ForEach
используется, когда вы хотите выполнить одну и ту же операцию для всех элементов в коллекции параллельно, блокируя текущий поток до тех пор, пока все операции не будут завершены.
async/await используется, когда текущая операция не может продвинуться дальше, пока не завершится конкретная асинхронная операция, но вы не хотите блокировать текущий поток. Это особенно полезно в двух ситуациях:
- Написание кода, который в основном запускает различные асинхронные операции, один за другим, в потоке пользовательского интерфейса, мгновенно доступ к интерфейсу между операциями. (Это более общее, чем это, но это простой пример.) Вы не хотите блокировать поток пользовательского интерфейса, но управление всеми этими асинхронными операциями является болью иначе.
- Обработка большого количества длительных операций за один раз - например. на веб-сервере. Каждый отдельный запрос может занять много времени из-за вызова в другую веб-службу, базы данных и т.д., Но вы не хотите иметь один поток для каждого запроса, поскольку потоки являются относительно дорогим ресурсом.
Вы можете объединить parallelism и асинхронность, отпустив новую задачу, которая вызовет Parallel.ForEach
, а затем ждет эту задачу. (Как один пример.)