在 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<>
指定是否并行执行是理所当然的。