【发布时间】:2017-01-12 14:35:24
【问题描述】:
我有以下代码:
static IEnumerable<int> foo()
{
int den = 0;
yield return 10;
yield return 10;
yield return 10;
yield return 10 / den;
yield return 10 / den;
}
static public void Main()
{
foreach (var item in foo().AsParallel().Take(3))
{
Console.WriteLine(item);
}
Console.ReadLine();
}
此代码失败(因为实际未使用的集合元素将被计算 - plinq 计算数据块)。 .Net 是否支持真正的“惰性”并行化(无需预先计算具有未使用元素的块)?
注意:这只是一个简单的例子。我明白,AsParallel 应该用于大数据以避免开销。
【问题讨论】:
-
我错过了什么吗?您只需要更改顺序,对吗?
foo().Take(3).AsParallel() -
有什么区别?
-
AsParallel()不知道后面会发生什么,因此它并行化了集合中的所有项目,因此出现了错误。Take(3).AsParallel()采用前 3 个元素,然后将它们并行化,因此没有错误。 -
@wdosanjos,据我了解,在您的情况下,结果收集不会以并行方式处理
-
如果
AsParallel是最后一个操作,那么结果类型将为ParallelEnumerableWrapper,它只给出简单的顺序枚举数
标签: c# .net linq parallel-processing plinq