我具有产生任务(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
}
你是什么意思第二选项不是异步?您触发的任务将在不同的线程下处理,Wait和WaitAll会影响主线程。 –
@ TMcKeown啊好吧,所以我认为等待的关键是等待whenall中的所有进程完成运行,然后才转移到之后的任何代码 – Pete
@Pete:“await Task.WhenAll”应该可以工作。确保你使用的是.NET 4.5,并且在你的web.config文件中将targetFramework设置为4.5。 –