并行编程

读<C#并发编程经典实例.PDF>总结:

  如果程序中存在大量的计算任务,并且这些任务能够分割成几个独立的任务块,那么就应该使用并行编程。

  并行编程可提高CPU利用率。

  通常情况下,服务器程序不适合并行编程。大多数服务器本身就具有并行能力,在服务器上进行并行编程,将降低本身的并行处理能力,不会有实际的好处。

  并行编程分类:1、数据并行  2、任务并行

       数据并行是指有大量的数据需要处理,并且每一块数据的处理过程是彼此独立的。

       任务并行是需要执行大量任务,并且每个任务的执行过程是基本独立的。

  数据并行的几种做法:

    1、使用 Parallel.ForEach 方法

    2、使用 PLINQ,它为LINQ 查询提供了 AsParallel 扩展。

       比较:跟PLINQ 相比,Parallel 对资源更加友好,Parallel 与系统中的其他进程配合得比较好 , 而PLINQ 会试图让所有的 CPU 来执行本进程。

        Parallel 的缺点是它太明显。很多情况下,PLINQ 的代码更加优美。

      并行处理有一个非常重要的准则:每个任务块要尽可能的互相独立。 只要任务块互相独立,并行的性能就能做到最优。一旦在多个线程中共享状态,必须以同步方式访问程序的状态时,程序的并行性就变差了。

  任务并行中使用一个Task来表示任务。

  

  并行任务错误处理:

  由于操作是并行处理的,多个异常就会同时发生。系统会把这些异常封装在 AggregateException 类中,在程序中抛出代码。

  AggregateException 类型有几个实用的 Flatten 和 Handle 方法,用来简化错误处理的代码:

  

try
 {
     Parallel.Invoke(() => { throw new Exception(); },
             () => { throw new Exception(); });
 }
 catch (AggregateException ex)
 {
     ex.Handle(exception =>
     {
     Trace.WriteLine(exception);
     return true; // “已经处理”
     });
 }                    

猜你喜欢

转载自www.cnblogs.com/tangchun/p/9138486.html