2014-04-09 232 views
19

我具有产生任务(See my previous post about threading)的阵列的方法,并且在该方法我有下列选项的端部:等待Task.WhenAll()与Task.WhenAll()等待()

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之间的区别是什么,因为第一个似乎没有等到任务完成,第二个完成,但我不想使用第二个如果它不是异步的。

我已经包括了第三个选项,因为我明白,这将锁定当前线程,直到所有的任务都完成了处理(看似同步,而不是asynchronus) - 请纠正我,如果我错了这一个

例用的await功能:

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 
} 
+0

你是什么意思第二选项不是异步?您触发的任务将在不同的线程下处理,Wait和WaitAll会影响主线程。 –

+0

@ TMcKeown啊好吧,所以我认为等待的关键是等待whenall中的所有进程完成运行,然后才转移到之后的任何代码 – Pete

+4

@Pete:“await Task.WhenAll”应该可以工作。确保你使用的是.NET 4.5,并且在你的web.config文件中将targetFramework设置为4.5。 –

回答

22

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

WhenAll创建任务* 当所有所有任务完成。

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

+0

因此,等待Task.WhenAll和Tasks.WhenAll()。Wait()之间应该没有区别,因为它们都应该等到whenall中的所有任务都完成后(因为它将创建新任务,然后等待直到新任务已经完成),但根据我的编辑,我有他们之间的不同行为,后者更像一个WaitAll – Pete

+1

你的等待不使用'WhenAll()'返回的任务对象。 'WhenAll()'返回一个任务,你从不使用它,因此没有等待,而另一个例子你在'WhenAll()'创建一个块时发出.'Wait()'。 –