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

2024-01-31

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

from item in items.AsParallel ()
   let result = DoExpensiveWork (item)
   select result;

这个可以不写吗

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

或者 let 子句有什么理由吗?这是否迫使它并行评估?


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

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)));
}

正如我们所看到的,两种方法之间的唯一区别是创建了一个中间局部变量。对该局部变量的赋值不会改变程序的行为。

为了更具体地回答你的问题,强制并行执行的代码实际上是调用ParallelEnumerable.AsParallel。 LINQ 查询仅在枚举时执行,因此按理说它是IEnumerable<>指定是否并行执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行 linq 中的 let 子句是否强制并行计算? 的相关文章

随机推荐