C# 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

总是有点弱的线程和刚刚通过的书

在第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 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();
}