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查询从"串行" 转为"并行" 执行using System ; using System. Linq ; // 数据源:1~10000 的整数集合 var numbers= Enumerable. Range ( 1 , 10000 ) ; // 【普通 LINQ(串行)】筛选偶数并乘以 2 var serialResult= numbers. Where ( n=> n% 2 == 0 ) . Select ( n=> n* 2 ) . ToList ( ) ; // 【PLINQ(并行)】仅新增 AsParallel(),其余语法完全一致 var parallelResult= numbers. AsParallel ( ) // 启用并行,核心开关 . Where ( n=> n% 2 == 0 ) . Select ( n=> n* 2 ) . ToList ( ) ; // 最终聚合为 List(触发查询执行) 2.PLINQ核心配置 1 ) . 控制并行度( WithDegreeOfParallelism) 限制并行执行的最大线程数( 默认等于CPU逻辑核心数) , 避免过度并行导致上下文切换var result= numbers. AsParallel ( ) . WithDegreeOfParallelism ( 4 ) // 强制最多 4 个线程并行 . Sum ( n=> n) ; 2 ) . 有序/ 无序查询( AsOrdered ( ) / AsUnOrdered ( ) ) a. PLINQ默认无序: 并行查询会打乱结果顺序, 性能更高 b. 保留原集合顺序, 需显示调用AsOrdered ( ) - 有额外性能开销// 无序(默认):结果顺序随机,性能优 var unordered= numbers. AsParallel ( ) . Where ( n=> n< 10 ) . ToList ( ) ; // 有序:结果顺序与原集合一致,性能略低 var ordered= numbers. AsParallel ( ) . AsOrdered ( ) // 强制保留顺序 . Where ( n=> n< 10 ) . ToList ( ) ; 3 ) . 执行模式( WithExecutionMode ( ) ) 控制PLINQ是否"强制并行" ( 默认: PLINQ 会自动判断, 若任务简单/ 数据量小, 可能降级为串行) var result= numbers. AsParallel ( ) . WithExecutionMode ( ParallelExecutionMode. ForceParallelism) // 强制并行(即使PLINQ认为串行更优) . Select ( n=> n* 2 ) . ToList ( ) ; 3.PLINQ异常 PLINQ会将多线程的异常包装为AggregateException, 需捕获并处理try { var result= numbers. AsParallel ( ) . Select ( n=> 100 / n) . ToList ( ) ; } catch ( AggregateException ex) { // 遍历所有线程的异常 foreach ( var innerExin ex. InnerExceptions) { Console. WriteLine ( $"异常: { innerEx. Message } " ) ; } } 4.PLINQ取消 PLINQ不会强制终止线程, 而是在查询执行的"检查点(如每次迭代开始 / 结束)" 检查CancellationToken的状态; 若令牌标 记为"已取消" , 则停止新迭代的执行, 终止查询 a. CancellationTokenSource( CTS) : 生成取消令牌的"源头" , 用于触发取消( 调用Cancel ( ) / CancelAfter ( ) ) b. CancellationToken: 由CTS生成, 通过WithCancellation ( ) 传递给PLINQ, 标记取消状态 c. OperationCanceledException: 取消触发时抛出的异常( 包装在 AggregateException 中) using System ; using System. Linq ; using System. Threading ; using System. Threading. Tasks ; class PLINQCancellationDemo { static void Main ( ) { // 1. 创建取消令牌源(控制取消) var cts= new CancellationTokenSource ( ) ; // 模拟:在 500ms 后触发取消(另一个线程) Task. Run ( ( ) => { Thread. Sleep ( 500 ) ; Console. WriteLine ( "触发取消..." ) ; cts. Cancel ( ) ; // 标记令牌为“已取消” } ) ; try { // 2. PLINQ 查询关联取消令牌 var numbers= Enumerable. Range ( 1 , 1000000 ) ; var result= numbers. AsParallel ( ) . WithCancellation ( cts. Token) // 核心:关联取消令牌 . WithDegreeOfParallelism ( 4 ) // 限制并行度 // 模拟耗时操作(让查询有足够时间被取消) . Select ( n=> { // 可选:手动检查令牌(加速取消响应) cts. Token. ThrowIfCancellationRequested ( ) ; Thread. Sleep ( 1 ) ; // 模拟单次迭代耗时 return n* 2 ; } ) . ToList ( ) ; // 触发查询执行 Console. WriteLine ( $"查询完成,结果数: { result. Count } " ) ; } catch ( AggregateException ex) { // 3. 处理取消异常(区分取消和其他异常) foreach ( var innerExin ex. InnerExceptions) { if ( innerExis OperationCanceledException ) { Console. WriteLine ( "PLINQ 查询已被取消" ) ; } else { Console. WriteLine ( $"其他异常: { innerEx. Message } " ) ; } } } finally { // 4. 释放资源(CTS 实现了 IDisposable) cts. Dispose ( ) ; } } }