8.3 并行编程(Parallel类)
概述
Parallel类是.NET Framework中System.Threading.Tasks命名空间提供的一组API,用于简化数据并行和任务并行的实现。它通过抽象化底层线程管理,帮助开发者高效利用多核CPU资源。
核心方法
1. Parallel.For
// 基本语法
Parallel.For(0, 100, i =>
{
Console.WriteLine($"迭代 {i} 在线程 {Thread.CurrentThread.ManagedThreadId}");
});
// 带循环选项的版本
var options = new ParallelOptions { MaxDegreeOfParallelism = 4 };
Parallel.For(0, 100, options, i => { /*...*/ });
2. Parallel.ForEach
List<string> data = GetLargeDataCollection();
Parallel.ForEach(data, item =>
{
ProcessItem(item);
});
3. Parallel.Invoke
Parallel.Invoke(
() => ProcessTask1(),
() => ProcessTask2(),
() => ProcessTask3()
);
关键特性
| 特性 | 说明 |
|---|---|
| 自动分区 | 自动将工作负载分配到多个核心 |
| 负载均衡 | 动态调整任务分配 |
| 异常聚合 | 收集所有并行任务中的异常 |
| 取消支持 | 通过CancellationToken实现 |
最佳实践
适度并行化:
- 避免对小型循环使用并行(建议>1000次迭代)
- 示例:矩阵运算、图像处理等CPU密集型任务
线程安全处理:
object lockObj = new object(); int sharedCounter = 0; Parallel.For(0, 1000, i => { lock(lockObj) { sharedCounter++; } });性能优化技巧:
- 使用
Partitioner自定义数据分区 - 设置
MaxDegreeOfParallelism限制并发度 - 避免在并行循环中执行I/O操作
- 使用
与async/await的区别
graph LR
A[Parallel类] -->|CPU密集型| B(数据并行)
C[async/await] -->|I/O密集型| D(异步操作)
典型应用场景
- 大数据处理(ETL流程)
- 科学计算(数值模拟)
- 媒体处理(视频转码)
- 机器学习(批量预测)
注意事项
- 避免修改共享集合(使用线程安全集合或同步机制)
- 注意异常处理(使用
AggregateException) - 警惕死锁风险(避免嵌套锁)
- 考虑使用PLINQ作为替代方案
扩展阅读
- 官方文档:Parallel Programming in .NET
- 《CLR via C#》第4版第27章
- TPL Dataflow库高级用法
