news 2026/6/9 0:47:34

1.16 PLINQ

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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();}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 5:14:30

RN Navigation vs Vue Router:从架构底层到工程实践的深度对比

[toc] 前言&#xff1a;这不是“谁更好”&#xff0c;而是“谁解决的问题不同” 很多团队在同时做 Web 和 RN 项目时&#xff0c;都会下意识问一句&#xff1a;Vue Router 这套东西&#xff0c;在 RN 里能不能也照着来&#xff1f;如果你只是做 Demo&#xff0c;答案是「看起来…

作者头像 李华
网站建设 2026/6/8 15:09:21

廊坊的婚介所靠谱吗?

我叫林晓阳&#xff0c;28岁&#xff0c;廊坊某科技公司程序员。三年前在相亲角遇到现在的丈夫&#xff0c;但那次经历让我对婚恋市场产生了深刻的认知。那年我抱着试试看的心态&#xff0c;走进了当地最大的婚介所。接待我的姑娘笑容甜美&#xff0c;递来一份精心设计的问卷&a…

作者头像 李华
网站建设 2026/6/8 9:02:07

新能源与燃油汽车对比数据可视化分析

新能源与燃油汽车对比数据可视化分析 1. 项目概述 本项目旨在通过数据挖掘技术,深入分析中国汽车市场中新能源汽车(EV)与传统燃油汽车(Gasoline)的竞争格局、销售趋势及关键影响因素。系统集成了数据预处理、探索性数据分析(EDA)、机器学习销量预测模型以及交互式Web可…

作者头像 李华
网站建设 2026/6/7 7:04:57

37、UNIX系统用户管理与支持全攻略

UNIX系统用户管理与支持全攻略 1. 用小事留下大印象 在与用户的交互中,一些看似微不足道的小事往往能给用户留下深刻的印象。以下是几个具体的方法: 1.1 倾听用户 作为管理员,日常工作总是十分繁忙,任务清单上总有做不完的事情。无论是在走廊上偶遇用户,还是用户打电话…

作者头像 李华
网站建设 2026/6/6 3:01:58

38、UNIX系统用户管理与故障处理全攻略

UNIX系统用户管理与故障处理全攻略 1 UNIX系统中的故障类型及时间预估 在使用UNIX服务器时,故障停机是难以避免的情况,而且要配合用户的使用时间来安排故障处理往往颇具挑战。常见的故障类型有以下三种: - 定期计划故障 :在生产环境中,这些是固定的停机时间,所有用户…

作者头像 李华
网站建设 2026/6/8 4:43:02

39、深入了解 UNIX 系统管理职业:层级、要求与发展路径

深入了解 UNIX 系统管理职业:层级、要求与发展路径 1. 引言 UNIX 系统管理工作涵盖了诸多方面,如求职、应对面试、面试候选人等。同时,还涉及与供应商、销售代表、响应中心、帮助台以及支持工程师的协作。这份工作远不止坐在终端前那么简单,接下来我们将详细了解 UNIX 系…

作者头像 李华