并行聚合操作

 1 方式一:
 2 static int ParallelSum(IEnumerable<int> values)
 3 {
 4  object mutex = new object();
 5   int result = 0;
 6   Parallel.ForEach(source: values,
 7   localInit: () => 0, 
 8   body: (item, state, localValue) => localValue + item,
 9   localFinally: localValue =>
10 {
11   lock (mutex)
12   result += localValue;
13 });
14 return result;
15 }
16 
17 方式二:
18 static int ParallelSum(IEnumerable<int> values)
19 {
20      return values.AsParallel().Sum();
21 }
22 
23 方式三:
24 static int ParallelSum(IEnumerable<int> values)
25 {
26 return values.AsParallel().Aggregate(
27     seed: 0,
28     func: (sum, item) => sum + item
29 );
30 }

按照并行LINQ(PLINQ)的默认方式,输出队列的次序是不固定的,也可以指明要保持原样的次序,如下:

 1 //输出是无序的
 2 static IEnumerable<int> MultiplyBy2(IEnumerable<int> values)
 3 {
 4 return values.AsParallel().Select(item => item * 2);
 5 }
 6 //输出保持原有的次序
 7 static IEnumerable<int> MultiplyBy2(IEnumerable<int> values)
 8 {
 9 return values.AsParallel().AsOrdered().Select(item => item * 2);
10 }

Parallel 类可适用于很多场合,但是在做聚合或进行数据序列的转换时, PLINQ 的代码更
加简洁。有一点需要注意,相比 PLINQ, Parallel 类与系统中其他进程配合得更好.

原文地址:https://www.cnblogs.com/goodlucklzq/p/4677487.html