我有以下代码:
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
应该用于大数据以避免开销。
答案 0 :(得分:1)
如果您禁止预先计算块,则无法并行执行任何工作。并行化任何流操作符的唯一方式是让他们查询更多的数据源项,而不是确定他们需要并预先计算它们的值。如果您不能允许任何数据预先计算,那么根据定义,您无法并行执行任何这些运算符的任何处理,只需要使用常规LINQ运算而不是PLINQ。