做3ds磁铁卡网站,一年网站维护,爱站之家,英语网站都可以做哪些内容1.并行循环基本语法
2.并行循环原理
3.并行循环中的异常处理
4.停止
5.中断1.并行循环基本语法
C#中的Parallel类(位于 System.Threading.Tasks 命名空间)是.NET提供的并行编程核心工具, 旨在简化数据并行和 任务并行开发, 充分利用多核CPU资源, 避免手…1.并行循环基本语法2.并行循环原理3.并行循环中的异常处理4.停止5.中断1.并行循环基本语法C#中的Parallel类(位于 System.Threading.Tasks 命名空间)是.NET提供的并行编程核心工具,旨在简化数据并行和任务并行开发,充分利用多核CPU资源,避免手动管理线程的复杂度;它的核心目标是将串行执行的任务(如循环、独立方 法)自动拆分为多个并行任务, 复用线程池线程执行,提升CPU密集型任务的效率1).Parallel.For:并行版for循环 替代传统的串行for循环,将循环迭代拆分为多个并行任务执行,适合遍历连续整数范围的场景usingSystem;usingSystem.Threading.Tasks;classParallelForDemo{staticvoidMain(){int[]datanewint[10000];// 初始化数组串行for(inti0;idata.Length;i)data[i]i;// 并行遍历数组每个元素乘以2CPU密集型Parallel.For(0,data.Length,i{data[i]*2;// 打印线程ID验证并行不同迭代可能在不同线程执行if(i%10000)Console.WriteLine($迭代{i}线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId});});Console.WriteLine($第一个元素:{data[0]}, 最后一个元素:{data[9999]});}}2).Parallel.Foreach:并行版foreach替代传统的串行foreach,遍历实现了IEnumerable的集合(如 List、数组、Dictionary),适合遍历非连续集合的场景usingSystem;usingSystem.Collections.Generic;usingSystem.Threading.Tasks;classParallelForEachDemo{staticvoidMain(){ListstringfruitsnewListstring{Apple,Banana,Orange,Grape,Mango};// 并行遍历集合处理每个元素Parallel.ForEach(fruits,fruit{stringupperFruitfruit.ToUpper();Console.WriteLine($处理结果:{upperFruit}(线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}));});}}3).Parallel.Invoke:并行执行多个独立的任务 用于一次性执行多个无返回值、无参数的独立方法,适合多任务并行执行场景usingSystem;usingSystem.Threading.Tasks;classParallelDemo{staticvoidMain(){// 并行执行两个独立方法无需关注执行顺序Parallel.Invoke(()CalculateSum(1,1000000),// 任务1计算1到100万的和()PrintMessage(Hello Parallel)// 任务2打印信息);Console.WriteLine(所有并行任务执行完成);}staticvoidCalculateSum(intstart,intend){longsum0;for(intistart;iend;i)sumi;Console.WriteLine($Sum:{sum}(线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}));}staticvoidPrintMessage(stringmsg){Console.WriteLine(${msg}(线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}));}}2.并行循环原理并行循环的原理是分块减少调度开销和线程复用避免创建成本a.数据分区(分块)—— 不是均分,而是动态按需分块并行循环首先会将待处理的数据集(比如0~999的迭代、List集合)拆分为若干分区(Chunk),但不是静态均分,而是由.NET 的分区器(Partitioner)动态调整-静态分区(适用于迭代执行时间均匀的场景)启动前将数据均分(比如1000个迭代,4核CPU拆成4块,每块250个),优点是分区开销小,缺点是如果某块迭代执行慢(比如 处理大数据),会导致有的线程闲、有的线程忙(负载不均)-动态分区(Parallel默认策略)不提前均分,而是按需分配小批次(比如每次分配10~20个迭代为一个小块),线程处理完当前小块后,立刻去领取下一 个小块,直到所有数据处理完 ✅优势:解决负载不均问题(比如某块迭代执行慢,其他线程不会等,继续领新块),最大化CPU利用率 b.线程调度 —— 复用线程池,而非创建新线程 Parallel循环不会为每个块创建新线程,而是复用.NET线程池(ThreadPool)的工作线程 线程池默认有最小线程数( CPU 核心数)和最大线程数(默认 1023),Parallel会向线程池请求线程,而非手动创建(避 免线程创建/销毁的昂贵开销)并行度(同时运行的线程数)默认由.NET根据CPU核心数、当前系统负载动态调整c.执行与线程复用 —— 一个线程处理多个块 线程与块不是一一绑定,一个线程处理完一个小块后,不会销毁,而是立刻从分区器领取下一个小块继续执行;直到所有小块 处理完毕,线程才会回到线程池,等待后续复用 d.收尾 —— 合并结果(如有)处理异常-若有共享结果(比如累加求和),需通过原子操作/锁-若多个块抛出异常,会封装为AggregateException统一抛出3.并行循环中的异常处理并行循环中的异常不会立即停止本次迭代,而是停止新的迭代;将trycatch放在并行循环的外面usingSystem;usingSystem.Threading.Tasks;classParallelExceptionBasic{staticvoidMain(){try{// 并行循环迭代1和3抛出不同异常Parallel.For(0,5,i{Console.WriteLine($迭代{i}开始执行);if(i1)thrownewArgumentException($参数非法迭代{i});// 业务异常1if(i3)thrownewDivideByZeroException($除零错误迭代{i});// 业务异常2Thread.Sleep(100);// 模拟业务逻辑});}// 必须捕获AggregateException而非单个异常catch(AggregateExceptionaggregateEx){Console.WriteLine($捕获到{aggregateEx.InnerExceptions.Count}个异常);// 遍历所有内部异常逐个处理foreach(varinnerExinaggregateEx.InnerExceptions){// 区分异常类型针对性处理switch(innerEx){caseArgumentExceptionargEx:Console.WriteLine($参数异常{argEx.Message});break;caseDivideByZeroExceptiondivEx:Console.WriteLine($除零异常{divEx.Message});break;default:Console.WriteLine($未知异常{innerEx.Message});break;}}}// 可选捕获其他非并行循环的异常比如参数错误catch(Exceptionex){Console.WriteLine($非聚合异常{ex.Message});}}}4.停止Stop是紧急停止—— 不管索引顺序,新迭代全不调度,已开始的迭代也建议尽快退出(而非执行完)usingSystem;usingSystem.Threading.Tasks;classParallelBreakVsStop{staticvoidMain(){Console.WriteLine( 测试 Stop() );varresultParallel.For(0,10,(i,state){Console.WriteLine($[{DateTime.Now:HH:mm:ss.fff}] 迭代{i}开始执行);if(i5){Console.WriteLine($[{DateTime.Now:HH:mm:ss.fff}] 触发 Stop());state.Stop();}// 关键检查IsStopped尽快退出Stop的核心if(state.IsStopped){Console.WriteLine($[{DateTime.Now:HH:mm:ss.fff}] 迭代{i}检测到Stop立即退出);return;// 不执行后续的500ms延迟}// 若没检测IsStopped才会执行完500ms这是你觉得没区别的常见原因Task.Delay(500).Wait();Console.WriteLine($[{DateTime.Now:HH:mm:ss.fff}] 迭代{i}执行完成);});Console.WriteLine($循环是否完成{result.IsCompleted});Console.WriteLine($最低中断迭代索引{result.LowestBreakIteration??-1}\n);}}5.中断Break是有序中断—— 保证中断点前的迭代全执行完,只停后面的usingSystem;usingSystem.Threading.Tasks;classParallelBreakVsStop{staticvoidMain(){Console.WriteLine( 测试 Break() );varresultParallel.For(0,10,(i,state){Console.WriteLine($[{DateTime.Now:HH:mm:ss.fff}] 迭代{i}开始执行);if(i5){Console.WriteLine($[{DateTime.Now:HH:mm:ss.fff}] 触发 Break());state.Break();}// 模拟耗时500ms的业务逻辑Break下会执行完Task.Delay(500).Wait();Console.WriteLine($[{DateTime.Now:HH:mm:ss.fff}] 迭代{i}执行完成);});Console.WriteLine($循环是否完成{result.IsCompleted});Console.WriteLine($最低中断迭代索引{result.LowestBreakIteration}\n);}}