平行Linq:有序治疗

时间:2013-03-09 23:06:15

标签: c# linq parallel-processing

我正在关注70-516 MS考试的材料,我看到他们解释说如果我们使用AsOrdered方法我们可以在进行并行处理时确保有序治疗。

但是,运行以下示例并不会按顺序输出结果。

基本上,下面的示例代码以10个整数的可枚举集合开始,然后对其进行并行化,然后排序,最后通过选择Compute函数返回偶数的元素进行过滤。 Compute函数只在1秒延迟后返回输入

private void TestLinqParallel()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        var source = Enumerable.Range(1, 10).AsParallel().AsOrdered();
        var evenNums = from num in source
                       where Compute(num) % 2 == 0
                       select num;
        evenNums.ForAll(ev =>
        {
            Debug.WriteLine(string.Format("{0} on Thread {1}", ev, Thread.CurrentThread.GetHashCode()));

        });
        sw.Stop();
        Debug.WriteLine(string.Format("Done {0}", sw.Elapsed));
    }
    public int Compute(int num)
    {
        Debug.WriteLine(string.Format("Computing {0} on Thread {1}", num, Thread.CurrentThread.GetHashCode()));
        Thread.Sleep(1000);
        return num;
    }

书中陈述

  

结果是有序的,至少对于偶数,这是什么   AsOrdered扩展方法是保证。

但这是我的结果..处理4之前的处理是

Computing 4 on Thread 11
Computing 3 on Thread 10
Computing 2 on Thread 12
Computing 1 on Thread 6
4 on Thread 11
Computing 7 on Thread 11
Computing 6 on Thread 6
2 on Thread 12
Computing 8 on Thread 12
Computing 5 on Thread 10
Computing 9 on Thread 11
6 on Thread 6
Computing 10 on Thread 6
8 on Thread 12
10 on Thread 6
Done 00:00:03.0561023

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

ForAll已并行化。这意味着所有排序保证都会离开Window,因为您的代码体是同时执行的。尝试foreach循环。