/// <summary>
///该实现方式并不是最高效的
///只是举个例子,说明用锁来保护共享状态
/// </summary>
/// <param name="values"></param>
/// <returns></returns>
static int ParallelSum(IEnumerable<int> values)
{
object mutex = new object();
int result = 0;
Parallel.ForEach(
source: values,
localInit: () => 0,
body: (item, state, localValue) => localValue + item,
localFinally: lovalValue =>
{
lock (mutex)
result += lovalValue;
}
);
return result;
}
static int ParallelSum2(IEnumerable<int> values)
{
return values.AsParallel().Aggregate(seed: 0, func: (sum, item) => sum + item);
} static int ParallelSum1(IEnumerable<int> values)
{
return values.AsParallel().Sum();
}
static void Main(string[] args)
{ for (int i = 0; i < 10; i++)
{
int[] nums = { 1, 23, 12, 31, 23, 12, 312, 3, 123, 12, 3 };
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("ParallelSum:" + ParallelSum(nums));
sw.Stop();
TimeSpan ts = sw.Elapsed;
Console.WriteLine(ts.TotalMilliseconds); Stopwatch sw1 = new Stopwatch();
sw1.Start();
Console.WriteLine("ParallelSum1:" + ParallelSum1(nums));
sw1.Stop();
TimeSpan ts1 = sw1.Elapsed;
Console.WriteLine(ts1.TotalMilliseconds); Stopwatch sw2 = new Stopwatch();
sw2.Start();
Console.WriteLine("ParallelSum2:" + ParallelSum2(nums));
sw2.Stop();
TimeSpan ts2 = sw2.Elapsed;
Console.WriteLine(ts2.TotalMilliseconds); }
}
总结:
第一次运行:ParallelSum2 比 ParallelSum1 ParallelSum 快几倍左右
第二次开始:ParallelSum2总体比ParallelSum1 ParallelSum快
所以运用Aggregate()聚合功能 good