并行查询中的惰性求值

时间:2017-01-12 14:35:25

标签: c# .net linq parallel-processing plinq

我有以下代码:

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应该用于大数据以避免开销。

1 个答案:

答案 0 :(得分:1)

如果您禁止预先计算块,则无法并行执行任何工作。并行化任何流操作符的唯一方式是让他们查询更多的数据源项,而不是确定他们需要并预先计算它们的值。如果您不能允许任何数据预先计算,那么根据定义,您无法并行执行任何这些运算符的任何处理,只需要使用常规LINQ运算而不是PLINQ。