并行编程
并行编程会通过暂时提升CPU利用率,来提高吞吐量,对CPU经常待命的客户端系统而言,这是求之不得的,但对于服务器端系统而言,这通常并不适用。总体来看,服务器上的并行编程会与其内置的并行机制冲突,因而不会带来任何实际益处
并行机制分为数据并行和任务并行。
数据并行的方法有很多,Parallel.ForEach,PLINQ
准则:各个工作块应当尽可能地相互独立
对所有种类的并行而言,错误处理都大同小异。因为操作是并行处理,所以有可能出现多个异常,因而,将他们包装在一起的AggregateException会被抛出。这种行为对于Parallel.ForEach、Parallel.Invoke、Task.Wait等都是一样的。AggregateException类型具备一些实用的Flatten方法和Handle方法,可用来简化错误处理代码。
try
{
Parallel.Invoke(()=>{throw new Exception();},()=>{throw new Exception();});
}
catch(AggregateException ex)
{
ex.Handle(exception=>{
Trace.WriteLine(exception);
return true;
});
任务不宜过短,也不宜过长
如果任务过短,那么将数据分解为任务并在线程池中调度这些任务的开销将变得非常大。如果任务过长,那么线程池无法高校地动态调整其工作平衡性。与其直接使用任务,不如用Parallel类型或PLINQ。这些比较高层的并行形式内置了分区功能,可自动处理这种问题(并在运行时做出必要调整。