任务的取消

   //当其中一个线程异常之后 之后的线程都取消
多线程里面抛出的异常只会终结当前线程,不会影响其他线程
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 @ 2020-09-02 23:45  游园惊梦、  阅读(154)  评论(0编辑  收藏  举报