使用AsSequential以保持顺序

时间:2013-10-09 07:27:30

标签: c# task-parallel-library plinq

我正在看这段代码

var numbers = Enumerable.Range(0, 20);
var parallelResult = numbers.AsParallel().AsOrdered()
    .Where(i => i % 2 == 0).AsSequential();

foreach (int i in parallelResult.Take(5))
    Console.WriteLine(i);

AsSequential()应该对结果数组进行排序。实际上它在执行后会被排序,但是如果我删除对AsSequential()的调用,它仍然会被调整(因为AsOrdered())。

两者有什么区别?

2 个答案:

答案 0 :(得分:10)

AsSequential只是为了阻止任何进一步的并行执行 - 因此得名。我不知道你在哪里认为它“应该使结果数组排序”。 documentation非常明确:

  

将ParallelQuery转换为IEnumerable以强制对查询进行顺序评估。

如你所说,AsOrdered确保排序(针对特定序列)。

答案 1 :(得分:2)

我知道这是一年多的问题,但这是我的两分钱。

在公开的示例中,我认为它使用AsSequential,以便下一个查询运算符(在本例中为Take运算符)顺序执行。

但是,Take运算符会阻止查询被并行化,除非源元素位于其原始索引位置,这就是为什么即使删除了AsSequential运算符,结果仍然会被排序。