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

1.16 PLINQ

1.PLINQ简介语法

2.PLINQ核心配置

3.PLINQ异常

4.PLINQ取消


1.PLINQ简介语法

PLINQ是LINQ的并行扩展,核心是通过AsParallel()启用并行查询,自动将查询任务分发到多线程池,利用多核CPU提升效率 a.PLINQ依赖System.Linq命名空间,支持内存集合(如List<T>、IEnumerable<T>),不支持LINQ to SQL/EF 等数据库查询 b.启用并行(AsParallel),调用后LINQ查询从"串行"转为"并行"执行
usingSystem;usingSystem.Linq;// 数据源:1~10000 的整数集合varnumbers=Enumerable.Range(1,10000);// 【普通 LINQ(串行)】筛选偶数并乘以 2varserialResult=numbers.Where(n=>n%2==0).Select(n=>n*2).ToList();// 【PLINQ(并行)】仅新增 AsParallel(),其余语法完全一致varparallelResult=numbers.AsParallel()// 启用并行,核心开关.Where(n=>n%2==0).Select(n=>n*2).ToList();// 最终聚合为 List(触发查询执行)

2.PLINQ核心配置

1).控制并行度(WithDegreeOfParallelism)限制并行执行的最大线程数(默认等于CPU逻辑核心数),避免过度并行导致上下文切换varresult=numbers.AsParallel().WithDegreeOfParallelism(4)// 强制最多 4 个线程并行.Sum(n=>n);
2).有序/无序查询(AsOrdered()/AsUnOrdered())a.PLINQ默认无序:并行查询会打乱结果顺序,性能更高 b.保留原集合顺序,需显示调用AsOrdered()-有额外性能开销// 无序(默认):结果顺序随机,性能优varunordered=numbers.AsParallel().Where(n=>n<10).ToList();// 有序:结果顺序与原集合一致,性能略低varordered=numbers.AsParallel().AsOrdered()// 强制保留顺序.Where(n=>n<10).ToList();
3).执行模式(WithExecutionMode())控制PLINQ是否"强制并行"(默认:PLINQ 会自动判断,若任务简单/数据量小,可能降级为串行)varresult=numbers.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism)// 强制并行(即使PLINQ认为串行更优).Select(n=>n*2).ToList();

3.PLINQ异常

PLINQ会将多线程的异常包装为AggregateException,需捕获并处理
try{varresult=numbers.AsParallel().Select(n=>100/n).ToList();}catch(AggregateExceptionex){// 遍历所有线程的异常foreach(varinnerExinex.InnerExceptions){Console.WriteLine($"异常:{innerEx.Message}");}}

4.PLINQ取消

PLINQ不会强制终止线程,而是在查询执行的"检查点(如每次迭代开始 / 结束)"检查CancellationToken的状态;若令牌标 记为"已取消",则停止新迭代的执行,终止查询 a.CancellationTokenSource(CTS):生成取消令牌的"源头",用于触发取消(调用Cancel()/CancelAfter())b.CancellationToken:由CTS生成,通过WithCancellation()传递给PLINQ,标记取消状态 c.OperationCanceledException:取消触发时抛出的异常(包装在 AggregateException 中)
usingSystem;usingSystem.Linq;usingSystem.Threading;usingSystem.Threading.Tasks;classPLINQCancellationDemo{staticvoidMain(){// 1. 创建取消令牌源(控制取消)varcts=newCancellationTokenSource();// 模拟:在 500ms 后触发取消(另一个线程)Task.Run(()=>{Thread.Sleep(500);Console.WriteLine("触发取消...");cts.Cancel();// 标记令牌为“已取消”});try{// 2. PLINQ 查询关联取消令牌varnumbers=Enumerable.Range(1,1000000);varresult=numbers.AsParallel().WithCancellation(cts.Token)// 核心:关联取消令牌.WithDegreeOfParallelism(4)// 限制并行度// 模拟耗时操作(让查询有足够时间被取消).Select(n=>{// 可选:手动检查令牌(加速取消响应)cts.Token.ThrowIfCancellationRequested();Thread.Sleep(1);// 模拟单次迭代耗时returnn*2;}).ToList();// 触发查询执行Console.WriteLine($"查询完成,结果数:{result.Count}");}catch(AggregateExceptionex){// 3. 处理取消异常(区分取消和其他异常)foreach(varinnerExinex.InnerExceptions){if(innerExisOperationCanceledException){Console.WriteLine("PLINQ 查询已被取消");}else{Console.WriteLine($"其他异常:{innerEx.Message}");}}}finally{// 4. 释放资源(CTS 实现了 IDisposable)cts.Dispose();}}}
http://www.cnnetsun.cn/news/137661.html

相关文章:

  • 基于最优指派策略的弹道导弹目标数据关联算法
  • 通达信主图MACD
  • Mistral 3 模型解析与部署实战:从 Large 3 到 Mini-stral
  • 2025网络安全学习路线 非常详细 推荐学习
  • 测试必知:线上出现BUG,该怎么办!
  • 【C++】学生管理系统设计与实现丨SQLite数据库版本
  • 第55集科立分板机:PCB激光分板机的效率如何
  • 28、UNIX 终端操作与测试实用指南
  • 31、UNIX实用技巧:ASCII表与经典编辑器使用指南
  • 三大限流算法:滑动窗口、令牌桶、漏桶
  • # 深入浅出 Flutter:构建跨平台应用的利器
  • 40、深入了解UNIX系统管理:职责与求职指南
  • stm32毕设本科生任务书指导
  • 效率神器!QuickTextPaste 便携版:快速文本粘贴 + 预设管理全攻略
  • 向量在计算机图形学中的核心应用
  • SelectDB索引实战:从入门到精通,避开那些年我踩过的坑
  • 探秘常见机器人控制运动上位机源码:解锁多种运动算法
  • 9 个降AI率工具,继续教育学生必备!
  • 运用工具Postman快速导出python接口测试脚本
  • 研发管理软件:合规・协同・智能・灵活为汽车部件行业研发管理强力赋能——全星研发管理APQP软件系统功能解析
  • EMS-NT企业微电网能碳管理平台:架构、功能与应用研究
  • 读捍卫隐私10读后总结与感想兼导读
  • OpenAI发布GPT-5.2系列;谷歌推出Gemini Deep Research API:AI领域的最新战况与未来前景
  • 华为云国际站代理商的AS跨境有什么优势呢?
  • NPP 草原:美国中部平原实验牧场(SGS),1939-1990 年,R1
  • CCD相机同步外触发拍照抓拍识别高速脉冲计数器信号采集模块
  • 【网络安全】2025新手如何上手挖漏洞(非常详细)零基础入门到精通,看这篇就够了!
  • BurpSuite渗透测试通关手册,简单几步带你从环境配置到报告生成
  • Python | OpenCV | 图像处理 | 入门实验 | 对比度增强 | 裁剪
  • Apifox:API 接口自动化测试完全指南