gpt4 book ai didi

.net - 并行 linq 中的 let 子句是否强制并行评估?

转载 作者:行者123 更新时间:2023-12-04 02:45:36 25 4
gpt4 key购买 nike

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

关于.net - 并行 linq 中的 let 子句是否强制并行评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18932685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com