2010-09-08 81 views
4

有没有更简单的方法来等待多个线程完成?也许使用ContinueWhenAll ...但我不想运行我的代码的其余部分异步。等待所有任务完成使用.NET 4.0中的任务并行库

List<object> objList = // something 

List<Task> taskHandles = new List<Task>(); 
for(int i = 0; i < objList.Count; i++) { 

    taskHandles.Add(Task.Factory.StartNew(() => { Process(objList[i]); })); 

} 

foreach(Task t in taskHandles) { t.Wait(); } 

DoSomeSync1(); 
.. 
DoSomeSync2(); 
.. 
DoSomeSync3(); 
.. 

// I could have used ContinueWhenAll(waitHandles, (antecedent) => { DoSomeSync...; }); 
// but I'd rather not have to do that. 
// It would be nice if I could have just done: 

Parallel.ForEach(objList, (obj) => { Process(obj); }).WaitAll(); 

// or something like that. 

回答

12

如果用Parallel.For()或更换for()循环Parallel.ForEach()你并不需要一个任务列表或任何东西。我不确定为什么你需要一个.WaitAll()后,一个ForEach,甚至似乎没有必要。

并行循环在所有任务完成时停止。

+0

我想确保在继续进行DoSomeSync调用之前,所有对象都已完成处理。 – 2010-09-08 15:18:20

+0

@杰夫:是的,我认为是。 Parallel.For()不需要WaitAll。 – 2010-09-08 16:01:51

+0

我明白你的意思了 - 是否有一些文件记录这个页面?我找不到任何东西。 – 2010-09-08 16:31:18