await Task.WhenAll()vs Task.WhenAll()。Wait()

时间:2014-04-09 15:02:12

标签: multithreading async-await c#-5.0

我有一个生成任务数组的方法(See my previous post about threading),在这个方法的最后我有以下选项:

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
 }

1 个答案:

答案 0 :(得分:27)

await await将返回调用者,并在等待任务完成时恢复方法执行。

WhenAll 创建任务* 全部所有任务完成后。

WaitAll将阻止创建线程(主线程),直到所有任务完成。