C# Fork/Join并行模式
总是有点弱的线程和刚刚通过的书 在第39页,下面是Fork/Join模式的示例C# Fork/Join并行模式,c#,parallel-processing,fork-join,C#,Parallel Processing,Fork Join,总是有点弱的线程和刚刚通过的书 在第39页,下面是Fork/Join模式的示例 static T[] MyParallelInvoke<T>(params Func<T>[] functions) { T[] results = new T[functions.Length]; Parallel.For(0, functions.Length, i => { results[i] = functions[i](); }); return
static T[] MyParallelInvoke<T>(params Func<T>[] functions)
{
T[] results = new T[functions.Length];
Parallel.For(0, functions.Length, i =>
{
results[i] = functions[i]();
});
return results;
}
static T[]MyParallelInvoke(params Func[]函数)
{
T[]结果=新的T[functions.Length];
Parallel.For(0,functions.Length,i=>
{
结果[i]=函数[i]();
});
返回结果;
}
方法4:使用PLINQ 静态T[]MyParallelInvoke(params Func[]函数) { 返回函数.AsParallel().Select(f=>f()).ToArray(); } 对于上述方法3,只是为了澄清所有官方结果是否都有值, 当你这样做的时候 “返回结果” 或者,根据线程是否已完成,是否只有部分线程具有值
与方法4类似,当您调用
ToArray()
Parallel.for()时,将返回具有IsCompleted属性的ParallelLoopResult 是的,在这两种情况下都有一个隐式的WaitAll()
Parallel.For()外部的代码是单线程的 我无法想象这什么时候是“错误的”。可能在异常之后。如果调用停止或中断,您可能无法获得预期的所有结果。正确的。但这并不是(不可能)表示线程仍在进行中。您如何知道何时调用此隐式WaitAll。在任何时候,我都会尝试访问并行循环之外的结果数组,从而知道调用了WaitAll吗?Parallel.For()代码>是一条语句。当你在这个语句之后,它里面的所有线程都完成了。鉴于有几种方法,你如何确定哪种是最好的方法?Thanks@AllenHo选项主要取决于环境,比如如何获取/存储/使用结果。线程是相同的。
// Approach #4: Using PLINQ
static T[] MyParallelInvoke<T>(params Func<T>[] functions)
{
return functions.AsParallel().Select(f => f()).ToArray();
}