我想知道在C#中,AsParallel和AsParallel.Select()之间的区别是什么,因为它们都返回AsParallelQuery的实例。 请考虑以下代码段:
var list = Enumerable.Range(1, 100).ToList();
var parallelList = list.AsParallel();
foreach (var num in parallelList)
System.Console.WriteLine(num);//returns 1 ..100 in order
var query = list.AsParallel().Select(num => num);
foreach (var num in query)
System.Console.WriteLine(num);/*returns 1..100 not in order*/
parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order
我想知道,list.AsParallel()和list.AsParallel()。Select()的解释方式不同
答案 0 :(得分:3)
AsParallel()
的作用是它意味着任何以下LINQ方法将并行执行。 不直接影响的是foreach
的行为方式。
所以,这个:
var parallelList = list.AsParallel();
foreach (var num in parallelList)
System.Console.WriteLine(num);//returns 1 ..100 in order
只是迭代list
的一种令人困惑的方式。它没有任何并行化。
虽然这个:
var query = list.AsParallel().Select(num => num);
foreach (var num in query)
System.Console.WriteLine(num);/*returns 1..100 not in order*/
并行执行(无用的)Select
查询,这可能会改变元素的顺序。但foreach
仍在单个线程上执行。
最后,这个:
parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order
除非您有一些自定义ForEach
扩展方法,否则无法编译,可能与foreach
的行为相同。 (有ForAll
,但情况有所不同。)