У меня есть метод, который создает массив задач (См. мой предыдущий пост о потоковой передаче), и в конце этого метода у меня есть следующие параметры:
await Task.WhenAll(tasks); // done in a method marked with async
Task.WhenAll(tasks).Wait(); // done in any type of method
Task.WaitAll(tasks);
В принципе, я хочу знать, какова разница между двумя whenall
, как первая, кажется, не дожидаются завершения задач, когда вторая делает, но я не хочу использовать вторую один, если он не асинхронный.
Я включил третий вариант, поскольку я понимаю, что это заблокирует текущий поток, пока все задачи не завершили обработку (по-видимому, синхронно вместо асинхрона). Пожалуйста, исправьте меня, если я ошибаюсь в этом вопросе
Пример функции с ожиданием:
public async void RunSearchAsync()
{
_tasks = new List<Task>();
Task<List<SearchResult>> products = SearchProductsAsync(CoreCache.AllProducts);
Task<List<SearchResult>> brochures = SearchProductsAsync(CoreCache.AllBrochures);
_tasks.Add(products);
_tasks.Add(brochures);
await Task.WhenAll(_tasks.ToArray());
//code here hit before all _tasks completed but if I take off the async and change the above line to:
// Task.WhenAll(_tasks.ToArray()).Wait();
// code here hit after _tasks are completed
}