C# 并行查询中的延迟计算

C# 并行查询中的延迟计算,c#,.net,linq,parallel-processing,plinq,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().AsParalle

我有以下代码:

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();
}
静态IEnumerable foo()
{
int-den=0;
收益率10;
收益率10;
收益率10;
收益率10/吨;
收益率10/吨;
}
静态公共void Main()
{
foreach(foo().AsParallel().Take(3)中的变量项)
{
控制台写入线(项目);
}
Console.ReadLine();
}
此代码失败(因为将计算实际未使用的集合元素-plinq计算数据块)。Net是否支持真正的“惰性”并行化(不预计算包含未使用元素的块)


注意:这只是一个简单的例子。我理解,
AsParallel
应该用于大数据,以避免开销。

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

我缺少什么吗?你只需要改变顺序,对吗
foo().Take(3).AsParallel()
有什么区别?
AsParallel()
不知道后面会发生什么,所以它会并行化集合中的所有项,从而导致错误
Take(3)。AsParallel()
将前3个元素并行化,因此没有错误。@wdosanjos,据我所知,在您的情况下,结果收集不会以并行方式处理如果
AsParallel
是最后一个操作,则结果类型将为
parallelEnumerableRapper
,它只提供简单的顺序枚举器,但为什么plinq处理额外的未使用元素?为什么它要预计算额外的元素?我不能理解这个想法。我无法理解为什么存储计算块会以并行方式提供更好的性能。@lmtinyton如果您只处理请求的项目,那么根据定义,您一次只能处理一个项目,因为一次只请求一个项目。您可以处理多个项目的唯一可能方法是要求比您要求的更多的项目。