任务的取消

复制代码
   //当其中一个线程异常之后 之后的线程都取消
多线程里面抛出的异常只会终结当前线程,不会影响其他线程
try { List<Task> list2 = new List<Task>(); CancellationTokenSource cts = new CancellationTokenSource(); for (int i = 0; i < 50; i++) { string name = i + "线程"; list2.Add(Task.Run(() => { try { if (!cts.IsCancellationRequested) Console.WriteLine(name + "开始"); Thread.Sleep(new Random().Next(50, 100)); if (name == "11线程" || name == "12线程") { cts.Cancel(); throw new Exception(name + "异常"); } if (!cts.IsCancellationRequested) Console.WriteLine(name + "结束"); else Console.WriteLine(name + "被取消"); } catch (Exception ex) { Console.WriteLine(ex.Message); cts.Cancel(); } }, cts.Token)); // cts.Token的作用:在cts.Cancel() 之后会抛出异常,即将cts.Cancel()之后的任务取消 cts.Cancel() 时还没有启动的任务就不启动了 } Task.WaitAll(list2.ToArray());//1:捕捉到异常的线程 } catch (AggregateException ex)//2 通过try catch AggregateException 遍历 { foreach (var item in ex.InnerExceptions) { Console.WriteLine(item.Message); } } catch (Exception ex) { }
复制代码

 

posted @   游园惊梦、  阅读(156)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示