以下是有问题的代码:var raw = Enumerable.Range(1, 10);var candidates = raw.AsParallel();var p1 = candidates.AsParallel() .SelectMany( ii => { Debug....
以下是有问题的代码:
var raw = Enumerable.Range(1, 10);
var candidates = raw.AsParallel();
var p1 = candidates.AsParallel()
.SelectMany(
ii =>
{
Debug.Log(">>>>> " + ii);
Thread.Sleep(1000);
Debug.Log("<<<<< " + ii);
return new[] { ii };
}
);
var p2 = p1.Select(
(v, i) => v);
var chosen = p2.FirstOrDefault();
执行后,给出以下日志:
>>>>> 1
<<<<< 1
>>>>> 2
<<<<< 2
>>>>> 3
<<<<< 3
>>>>> 4
<<<<< 4
>>>>> 5
<<<<< 5
>>>>> 6
<<<<< 6
>>>>> 7
<<<<< 7
>>>>> 8
<<<<< 8
>>>>> 9
<<<<< 9
>>>>> 10
<<<<< 10
执行耗时 10 秒。理论上应该耗时 1 秒, >>>>> x
执行后立即到达。
这种行为的原因是什么以及如何解决它?
更新1: 我已经试验了第一个答案的解决方案:
var raw = Enumerable.Range(1, 10);
var candidates = raw.AsParallel()
.WithExecutionMode(ParallelExecutionMode.ForceParallelism);
var p1 = candidates.AsParallel()
.SelectMany(
ii =>
{
Debug.Log(">>>>> " + ii);
Thread.Sleep(1000);
Debug.Log("<<<<< " + ii);
return new[] { ii };
}
);
var p2 = p1.Select(
(v, i) => v);
var chosen = p2.FirstOrDefault();
结果仍然失败:
>>>>> 3
<<<<< 3
>>>>> 2
<<<<< 2
>>>>> 1
<<<<< 1
>>>>> 4
<<<<< 4
>>>>> 5
<<<<< 5
>>>>> 6
<<<<< 6
>>>>> 7
<<<<< 7
>>>>> 8
<<<<< 8
>>>>> 9
<<<<< 9
>>>>> 10
<<<<< 10
在 C# 8 / Unity 2022 中,为什么 PLINQ SelectMany + Select + FirstOrDefault 以顺序模式执行?
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!