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

Ожидание Task.WhenAll() vs Task.WhenAll(). Wait()

У меня есть метод, который создает массив задач (См. мой предыдущий пост о потоковой передаче), и в конце этого метода у меня есть следующие параметры:

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
 }
4b9b3361

Ответ 1

await ожидание вернется к вызывающему абоненту и возобновит выполнение метода, когда ожидаемая задача будет завершена.

WhenAll создаст задачу * Когда все задания будут завершены.

WaitAll будет блокировать поток создания (основной поток), пока все задачи не будут завершены.