2013-03-09 161 views
3

我正在跟踪70-516 MS考试的材料,并且我发现他们解释说如果我们使用AsOrdered方法,我们可以确保在进行并行处理时进行有序处理。并行Linq:订单治疗

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

基本上,下面的示例代码以10个整数的可枚举集合开始,然后将其并行化,然后进行排序并最终通过仅选择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,处理过程的2

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 

的处理谁能帮助过吗?

回答

3

ForAll被并行化。这意味着所有订单保证都会从窗口中消失,因为您的代码体是同时执行的。尝试一个foreach循环。