Parallel.ForEach:如何阻止主线程,直到完成所有并行任务
在以下情况下:我们是否可以阻止主线程开始执行第3步,直到第2步完成?
我说的是C#Parallel.ForEach:如何阻止主线程,直到完成所有并行任务
//step 1: some tasks
/*
*/
//step 2: perform some sub tasks in parallel.
Parallel.ForEach(X, x => Foo(x));
//step 3: Some other task
//Can we begin to perform step 3 until all sub tasks in step 2 finished???
这应该是默认行为。把它放在一个console.writeline的控制台应用程序中,以便在需要时证明它。
如果使用Task类打造的“任务”,你所提到的,可能会尝试Task.WaitAll(Task[])
他没有使用'Task'类,他使用'Parallel'类。这并不能解答这个问题。 – 2014-10-11 08:13:27
恕我直言,你的问题标题是从你打算问或达到什么样的不同。让我们从你的帖子中了解到:
当Parallel.ForEach
开始执行时,它将阻塞主线程的执行,直到完成所有foreach中的并行执行为止,而当并行处于打开状态时,则需要执行步骤3也会得到执行,然后等待并行执行在主线程继续之前完成,或者可能更多步骤,如3,4,5,然后等待并行执行完成后退出。以下代码将有助于:
// Step 1 - Do something
// Step 2 - Run tasks in parallel
List<Task> taskList = new List<Task>();
for(int i=0; i< X; i++)
{
taskList.add(Task.Factory.StartNew((i) => {Foo(i); }));
}
// Step3
// Step4
// Step5
// Wait for Tasks here
Task.WaitAll(taskList.ToArray())
//Remaining steps and main thread exit
这不是OP所要求的。相反,他想阻塞,直到foreach循环完成,这是默认行为。 – 2014-10-11 08:15:53
@Yuval Itzchakov请再次回顾这个问题,你所建议的是标题和默认行为,但是当第二步仍然处于打开状态时,OP想要执行第三步,这就是为什么我建议两个代码之间存在差异并粘贴了代码会做那份工作 – 2014-10-11 12:18:32
'Parallel.ForEach'将等待。 – Ofiris 2014-10-11 07:01:43