手机网站布局教程,搜索引擎优化网页,网站购物建设实训心得体会,网站建设是不是无形资产1.PLINQ简介语法
2.PLINQ核心配置
3.PLINQ异常
4.PLINQ取消 1.PLINQ简介语法
PLINQ是LINQ的并行扩展, 核心是通过AsParallel()启用并行查询, 自动将查询任务分发到多线程池, 利用多核CPU提升效率a.PLINQ依赖System.Linq命名空间, 支持内存集合(如ListT、IEnumerabl…1.PLINQ简介语法2.PLINQ核心配置3.PLINQ异常4.PLINQ取消1.PLINQ简介语法PLINQ是LINQ的并行扩展,核心是通过AsParallel()启用并行查询,自动将查询任务分发到多线程池,利用多核CPU提升效率 a.PLINQ依赖System.Linq命名空间,支持内存集合(如ListT、IEnumerableT),不支持LINQ to SQL/EF 等数据库查询 b.启用并行(AsParallel),调用后LINQ查询从串行转为并行执行usingSystem;usingSystem.Linq;// 数据源1~10000 的整数集合varnumbersEnumerable.Range(1,10000);// 【普通 LINQ串行】筛选偶数并乘以 2varserialResultnumbers.Where(nn%20).Select(nn*2).ToList();// 【PLINQ并行】仅新增 AsParallel()其余语法完全一致varparallelResultnumbers.AsParallel()// 启用并行核心开关.Where(nn%20).Select(nn*2).ToList();// 最终聚合为 List触发查询执行2.PLINQ核心配置1).控制并行度(WithDegreeOfParallelism)限制并行执行的最大线程数(默认等于CPU逻辑核心数),避免过度并行导致上下文切换varresultnumbers.AsParallel().WithDegreeOfParallelism(4)// 强制最多 4 个线程并行.Sum(nn);2).有序/无序查询(AsOrdered()/AsUnOrdered())a.PLINQ默认无序:并行查询会打乱结果顺序,性能更高 b.保留原集合顺序,需显示调用AsOrdered()-有额外性能开销// 无序默认结果顺序随机性能优varunorderednumbers.AsParallel().Where(nn10).ToList();// 有序结果顺序与原集合一致性能略低varorderednumbers.AsParallel().AsOrdered()// 强制保留顺序.Where(nn10).ToList();3).执行模式(WithExecutionMode())控制PLINQ是否强制并行(默认:PLINQ 会自动判断,若任务简单/数据量小,可能降级为串行)varresultnumbers.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism)// 强制并行即使PLINQ认为串行更优.Select(nn*2).ToList();3.PLINQ异常PLINQ会将多线程的异常包装为AggregateException,需捕获并处理try{varresultnumbers.AsParallel().Select(n100/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. 创建取消令牌源控制取消varctsnewCancellationTokenSource();// 模拟在 500ms 后触发取消另一个线程Task.Run((){Thread.Sleep(500);Console.WriteLine(触发取消...);cts.Cancel();// 标记令牌为“已取消”});try{// 2. PLINQ 查询关联取消令牌varnumbersEnumerable.Range(1,1000000);varresultnumbers.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 实现了 IDisposablects.Dispose();}}}