我知道如何加入一个简单的线程让父线程等待它们,但我不知道如何在System.Threading.Tasks命名空间中实现自动线程。这是一个例子。我在主函数中调用了两个函数,我想分别执行它们。每个函数都有一个parallel.for。现在,如何在调用第二个函数之前让主线程等待第一个函数的所有线程完成?
static void Main(string[] args)
{
fill();
// now main should wait for threads of fill function to finish
filter();
}
void filter()
{
parallel.for(some action);
}
void fill()
{
parallel.for(some action);
}
答案 0 :(得分:3)
Parallel.For Method在多个线程之间内部迭代迭代,但随后它会阻塞直到它们全部完成。因此,您的代码是主函数的视图中的序列代码:
我们分叉循环迭代的处理,我们只连接并行循环调用 完成所有并发处理后完成。
如果需要在循环中共享某个本地状态,请使用函数的Parallel.For Method (Int32, Int32, Func, Func, Action)版本:
public static ParallelLoopResult For<TLocal>(
int fromInclusive,
int toExclusive,
Func<TLocal> localInit,
Func<int, ParallelLoopState, TLocal, TLocal> body,
Action<TLocal> localFinally
)
下图描绘了它的工作原理:
以下是计算并行PI的示例实现:
static double ParallelPi()
{
double sum = 0.0;
double step = 1.0 / (double)NUM_STEPS;
object obj = new object();
Parallel.For(0, NUM_STEPS,
() => 0.0,
(i, state, partial) =>
{
double x = (i + 0.5) * step;
return partial + 4.0 / (1.0 + x * x);
},
partial => { lock (obj) sum += partial; });
return step * sum;
}
有关Parallel类如何与示例一起工作的深入信息,请阅读Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4(Blackquote,图像和示例均来自那里)