当前位置: 首页 > news >正文

深入解析C#并行编程:从并行循环到异步编程模式

在当今多核处理器普及的时代,高效利用计算资源成为开发者必备技能。本文将深入剖析C#中的并行编程利器——任务并行库(TPL)和经典异步模式,助你提升程序性能。

🚀 一、任务并行库(TPL)核心机制

1. Parallel.For:并行化的for循环

通过简单改造传统for循环实现多核并行计算:

Parallel.For(0, 15, i => Console.WriteLine($"The square of {i} is {i*i}"));
  • 执行特点:迭代独立且无序执行,自动分配线程资源
  • 关键参数:
    • fromInclusive:起始索引(包含)
    • toExclusive:结束索引(不包含)
    • Action<int>:迭代逻辑委托

实用场景:矩阵运算、批量图像处理等CPU密集型任务

2. Parallel.ForEach:集合并行处理器

高效处理IEnumerable集合的并行方案:

string[] words = {"We", "hold", "these", "truths"};
Parallel.ForEach(words, word => Console.WriteLine($"\"{word}\" has {word.Length} letters"));
  • 智能分配:自动分割集合元素到不同线程
  • 注意事项:集合需线程安全,避免共享状态修改

实战技巧:数据批处理时优先选择ForEach,代码更简洁


🔄 二、并行循环的三大特性

1. 自动负载均衡

TPL动态监控CPU负载,智能分配迭代任务到不同核心

2. 结果顺序保留

即使执行顺序随机,结果数组仍保持原始顺序:

int[] squares = new int[50];
Parallel.For(0, 50, i => squares[i] = i * i);
// 结果:[0,1,4,9...2401] 保持索引顺序 

3. 异常聚合机制

自动捕获所有线程异常,抛出AggregateException统一处理


⏳ 三、经典异步编程模式解析

虽然async/await已成主流,但理解传统模式仍具价值:

委托异步三剑客:

delegate int MyDel(int x);
MyDel del = x => x * x;// 1. 开始异步执行 
IAsyncResult iar = del.BeginInvoke(5, null, null);// 2. 获取结果 
int result = del.EndInvoke(iar);

三种经典模式对比:

模式实现方式适用场景
等待直到完成EndInvoke阻塞调用简单异步,需立即结果
轮询模式循环检查IsCompleted属性需中间处理的长时间任务
回调模式AsyncCallback委托通知事件驱动架构,避免主线程阻塞

回调模式示例:

del.BeginInvoke(5, ar => {int res = del.EndInvoke(ar);Console.WriteLine($"Result: {res}");
}, null);

⚖️ 四、新旧异步模式对比

传统模式痛点:

  • 代码嵌套复杂(回调地狱)
  • 手动线程管理易出错
  • 异常处理困难

async/await革命性优势:

async Task<int> CalculateAsync()
{return await Task.Run(() => 5 * 5);
}
  • 线性代码结构
  • 自动上下文延续
  • 同步的异常处理机制

💡 五、实战建议

1. 并行选择策略:

  • CPU密集型:优先选用Parallel.For/ForEach
  • IO密集型:选择async/await+Task.Run

2. 避坑指南:

// 错误示例:共享变量未保护 
int sum = 0;
Parallel.For(0, 100, i => sum++); // 结果不确定 // 正确方案:使用线程安全操作 
Interlocked.Add(ref sum, 1);

3. 性能优化:

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount - 1 
};
Parallel.For(0, 1000, options, ...);

🌟 结语

掌握并行编程如同获得性能加速器:

  • 多核计算首选TPL并行循环
  • 现代项目优先采用async/await
  • 理解传统模式有助于解决遗留系统问题

性能测试挑战:尝试对比Parallel.For与普通for循环在1000万次计算中的性能差异,评论区分享你的测试结果!👇

异步编程模式对比图

http://www.dtcms.com/a/324936.html

相关文章:

  • PyCATIA深度解析:基于装配截面自动化创建参考几何平面群的专业方案
  • 锂电生产设备健康管理:基于预测性维护的智能化解决方案​
  • 【github.io静态网页 怎么使用 github.io 搭建一个简单的网页?】
  • Python与MySQL数据库交互实践:自动化数据插入系统
  • GPU版的Pytorch安装(Win11)
  • SpringBoot项目自定义静态资源映射规则
  • 【嵌入式】Linux的常用操作命令 (1)
  • SAP 121移动类型的说明
  • C野指针的概念与应对(源头、阻隔、定位)
  • STM32定时器与延时系统完整笔记
  • 【C#补全计划】万类之父中的方法
  • 使用单调栈解决力扣第42题--接雨水
  • 亚麻云之静态资源管家——S3存储服务实战
  • SSH远程连接TRAE时显示权限被拒绝检查方案
  • 游泳学习 — 蛙泳
  • 变量详解:创建初始化与内存管理
  • go加速配置(下载第三方库)
  • go语言运算符
  • Java变量的声明规则与Scanner的应用
  • 算法训练营day44 动态规划⑪ 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
  • BGP实验
  • (三)全栈(部署)
  • 数学建模——回归分析
  • 解决 Linux 下 “E: 仓库xxx没有数字签名” 问题
  • C++高频知识点(十九)
  • CentOS7.9 离线安装mysql数据库
  • Python vs MATLAB:智能体开发实战对比
  • 安卓录音方法
  • Python描述符进阶:自定义文档与属性删除的艺术
  • 可视化程序设计(4) - 第一个图形窗口程序