C# 并行编程
传统的同步代码执行的模式是等待上一个任务执行完了,然后再执行下一个任务,这样的缺点是速度慢
比如在以下代码中,有一个长度为10的List和一个处理程序,处理程序会处理List中的每一个项,处理速度是5s/个,那么执行完所有项需要50s
List<int> numList = new List<int>();
for(int i = 1; i <= 10; i++)
{
numList.Add(i);
}
foreach(int item in numList)
{
Console.WriteLine($"Begin {item}th task...");
Thread.Sleep(5000);
Console.WriteLine($"Stop {item}th task...");
}
如何提高任务处理的速度呢?一个简单的思路就是并行执行,把10个任务交给10个工人处理,假设一个工人处理一个任务需要5s,那么10个工人处理10个任务也只需要5s
List<int> numList = new List<int>();
for(int i = 1; i <= 10; i++)
{
numList.Add(i);
}
//foreach(int item in numList)
//{
// Console.WriteLine($"Begin {item}th task...");
// Thread.Sleep(5000);
// Console.WriteLine($"Stop {item}th task...");
//}
Parallel.ForEach(numList, (item, state) =>
{
Console.WriteLine($"Begin {item}th task...");
Thread.Sleep(5000);
Console.WriteLine($"Stop {item}th task...");
});
除了Parallel.ForEach方法,Parallel还具有其它方法也可以实现并行编程
For
Parallel.For(1, 11, (item, state) =>
{
Console.WriteLine($"Begin {item}th task...");
Thread.Sleep(5000);
Console.WriteLine($"Stop {item}th task...");
});
Invoke
Parallel.Invoke(() =>
{
Console.WriteLine("Begin 1th task...");
Thread.Sleep(5000);
Console.WriteLine("Stop 1th task...");
},
() =>
{
Console.WriteLine("Begin 2th task...");
Thread.Sleep(5000);
Console.WriteLine("Stop 2th task...");
});
并行计算
假设有一个复杂的计算可以分步进行,并且计算结果与计算顺序无关(例如累加或累乘),那么我们可以采用并行的方式来提高计算效率
为了方便演示,这里采用了一个简单的并行累加demo程序
假设我们需要使用程序来求1到100的和,并且假设一次加法需要消耗500ms时间,那么我们可以采用以下代码来进行并行编程
int sum = 0;
var result = Parallel.For(
fromInclusive: 1,
toExclusive: 101,
/*parallelOptions: new ParallelOptions() {
MaxDegreeOfParallelism = 100 //最大并发数
},*/
localInit: () => 0,
body: (item, state, localSum) =>
{
Console.WriteLine($"Begin {item}th task...");
Thread.Sleep(500);
localSum += item;
Console.WriteLine($"Stop {item}th task...");
return localSum;
},
localFinally: (localSum) => Interlocked.Add(ref sum, localSum)
);
Console.WriteLine(sum);
实际上For、ForEach、Invoke还提供了很多重载方法
与之相关的类也有不少,都在System.Threading.Tasks命名空间下
更多内容可查阅官网