我正在关注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
有人可以帮忙吗?
答案 0 :(得分:3)
ForAll
已并行化。这意味着所有排序保证都会离开Window,因为您的代码体是同时执行的。尝试foreach
循环。