Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 8.3 并行编程(Parallel类)

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实现

最佳实践

  1. 适度并行化:

    • 避免对小型循环使用并行(建议>1000次迭代)
    • 示例:矩阵运算、图像处理等CPU密集型任务
  2. 线程安全处理:

    object lockObj = new object();
    int sharedCounter = 0;
    
    Parallel.For(0, 1000, i => 
    {
        lock(lockObj) 
        {
            sharedCounter++;
        }
    });
    
  3. 性能优化技巧:

    • 使用Partitioner自定义数据分区
    • 设置MaxDegreeOfParallelism限制并发度
    • 避免在并行循环中执行I/O操作

与async/await的区别

graph LR
    A[Parallel类] -->|CPU密集型| B(数据并行)
    C[async/await] -->|I/O密集型| D(异步操作)

典型应用场景

  1. 大数据处理(ETL流程)
  2. 科学计算(数值模拟)
  3. 媒体处理(视频转码)
  4. 机器学习(批量预测)

注意事项

  • 避免修改共享集合(使用线程安全集合或同步机制)
  • 注意异常处理(使用AggregateException)
  • 警惕死锁风险(避免嵌套锁)
  • 考虑使用PLINQ作为替代方案

扩展阅读

  • 官方文档:Parallel Programming in .NET
  • 《CLR via C#》第4版第27章
  • TPL Dataflow库高级用法
Last Updated:: 5/3/25, 11:34 PM