读 <C# 并发编程经典实例. PDF> 总结:
如果程序中存在大量的计算任务, 并且这些任务能够分割成几个独立的任务块, 那么就应该使用并行编程.
通常情况下, 服务器程序不适合并行编程. 大多数服务器本身就具有并行能力, 在服务器上进行并行编程, 将降低本身的并行处理能力, 不会有实际的好处.
并行编程分类: 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; // "已经处理"
- });
- }
并行编程
来源: http://www.bubuko.com/infodetail-2631523.html