let子句并行linq是否强制并行评估?

时间:2013-09-21 12:36:29

标签: .net linq

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

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

这可不是写的

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

或者是否有let子句的原因?这会强制它被并行评估吗?

1 个答案:

答案 0 :(得分:4)

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

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<>的生成器,指定它是否并行执行。