.net 并行linq中的let子句是否强制进行并行计算?

.net 并行linq中的let子句是否强制进行并行计算?,.net,linq,.net,Linq,在xamarin iOS站点上有以下并行linq示例 from item in items.AsParallel () let result = DoExpensiveWork (item) select result; 这难道不是我写的吗 from item in items.AsParallel () select DoExpensiveWork (item); 还是有理由让条款生效?这会迫使它并行计算吗?让我们看看生成的代码(当然是反编译的): private sta

在xamarin iOS站点上有以下并行linq示例

from item in items.AsParallel ()
   let result = DoExpensiveWork (item)
   select result;
这难道不是我写的吗

from item in items.AsParallel ()
   select DoExpensiveWork (item);

还是有理由让条款生效?这会迫使它并行计算吗?

让我们看看生成的代码(当然是反编译的):

private static void WithLet(IEnumerable items)
{
ParallelEnumerable.Select(ParallelEnumerable.Select)(ParallelEnumerable.AsParallel(项目),项目=>
{
var local_0=新
{
项目=项目,
结果=程序.DoExpensiveWork(项目)
};
返回本地_0;
}),param0=>param0.result);
}
带出口的专用静态空隙(IEnumerable items)
{
ParallelEnumerable.Select(ParallelEnumerable.AsParallel(items),(Func)(item=>Program.DoExpensiveWork(item));
}
正如我们所看到的,这两种方法之间的唯一区别是创建了一个中间局部变量。对该局部变量的赋值不会改变程序的行为


为了更具体地回答您的问题,强制执行并行的代码实际上是调用
ParallelEnumerable.aspallel
。LINQ查询仅在枚举时执行,因此很显然,指定是否并行执行的是
IEnumerable
的生成器。

输出将相同,两个查询的并行执行也没有区别。
private static void WithLet(IEnumerable<int> items)
{
  ParallelEnumerable.Select(ParallelEnumerable.Select(ParallelEnumerable.AsParallel<int>(items), item =>
  {
    var local_0 = new
    {
      item = item,
      result = Program.DoExpensiveWork(item)
    };
    return local_0;
  }), param0 => param0.result);
}

private static void WithoutLet(IEnumerable<int> items)
{
  ParallelEnumerable.Select<int, object>(ParallelEnumerable.AsParallel<int>(items), (Func<int, object>) (item => Program.DoExpensiveWork(item)));
}