Мне нужно запустить несколько асинхронных задач в консольном приложении и дождаться их завершения перед дальнейшей обработкой.
Есть много статей, но я, кажется, растерялся, когда больше читаю. Я прочитал и понял основные принципы библиотеки задач, но мне явно не хватает ссылки где-то.
Я понимаю, что можно объединить задачи так, чтобы они запускались после завершения другого (что в значительной степени является сценарием для всех статей, которые я прочитал), но я хочу, чтобы все мои задачи выполнялись одновременно, и я хочу знать один раз они все завершены.
Какая простейшая реализация для такого сценария?
источник
await Task.WhenAll(task1, task2);
?Task.WhenAll
не запускает задачи для вас. Вы должны предоставить им «горячий», то есть уже началось.StartNew
имеют новые задачи к асинхронному ожиданию их всех?Вы можете создать много задач, таких как:
источник
Лучший вариант, который я видел, это следующий метод расширения:
Назовите это так:
Или с асинхронной лямбдой:
источник
Вы можете использовать
WhenAll
метод, который будет возвращать ожидаемый объектTask
илиWaitAll
который не имеет типа возврата, и будет блокировать дальнейшее выполнение кода симулировано доThread.Sleep
тех пор, пока все задачи не будут завершены, отменены или сбои.пример
Если вы хотите выполнять задачи в определенном порядке, вы можете получить вдохновение от этого ответа.
источник
await
для каждой операции и в то же время использоватьWaitAll
илиWhenAll
. Не должны ли задачи приTask[]
инициализации быть безawait
?Вы хотите соединить цепочки
Task
или они могут быть вызваны параллельно?Для цепочки
Просто сделай что-то вроде
и не забудьте проверить предыдущий
Task
экземпляр в каждом, такContinueWith
как он может быть неисправен.Для параллельного подхода
Самый простой метод, с которым я сталкивался: в
Parallel.Invoke
противном случае естьTask.WaitAll
или вы даже можете использоватьWaitHandle
s для обратного отсчета до нуля оставленных действий (подождите, есть новый класс:)CountdownEvent
, или ...источник
Вот как я это делаю с массивом Func <> :
источник
Еще один ответ ... но я обычно нахожусь в случае, когда мне нужно одновременно загрузить данные и поместить их в переменные, например:
источник
LoadCatsAsync()
иLoadDogAsync()
являются просто вызовами базы данных, они связаны с IO.Task.Run()
для работы с процессором; это добавляет дополнительные ненужные издержки, если все, что вы делаете, - это ожидаете ответа от сервера базы данных. Принятый ответ Ювала - правильный путь для работы, связанной с IO.Я подготовил фрагмент кода, чтобы показать вам, как использовать задачу для некоторых из этих сценариев.
источник