1 //线程取消不是操作线程,而是操作信号量(共享变量,多个线程都能访问到的东西,变量/数据库的数据/硬盘数据) 2 //每个线程在执行的过程中,经常去查看下这个信号量,然后自己结束自己 3 //线程不能别人终止,只能自己干掉自己,延迟是少不了的 4 //CancellationTokenSource可以在cancel后,取消没有启动的任务 5 CancellationTokenSource cts = new CancellationTokenSource();//bool值 6 for (int i = 0; i < 40; i++) 7 { 8 string name = string.Format("btnThreadCore_Click{0}", i); 9 Action<object> act = t => 10 { 11 try 12 { 13 //if (cts.IsCancellationRequested) 14 //{ 15 // Console.WriteLine("{0} 取消一个任务的执行", t); 16 //} 17 Thread.Sleep(2000); 18 if (t.ToString().Equals("btnThreadCore_Click11")) 19 { 20 throw new Exception(string.Format("{0} 执行失败", t)); 21 } 22 if (t.ToString().Equals("btnThreadCore_Click12")) 23 { 24 throw new Exception(string.Format("{0} 执行失败", t)); 25 } 26 if (cts.IsCancellationRequested)//检查信号量,是否已经取消这个cts 27 { 28 Console.WriteLine("{0} 放弃执行", t); 29 //return; 30 } 31 else 32 { 33 Console.WriteLine("{0} 执行成功", t); 34 } 35 } 36 catch (Exception ex) 37 { 38 //传达取消请求 39 cts.Cancel(); 40 Console.WriteLine(ex.Message); 41 } 42 }; 43 //cts.Token cts被设置为取消状态后可以自动抛出异常,后面的线程就都不启动了 44 taskList.Add(taskFactory.StartNew(act, name, cts.Token)); 45 } 46 Task.WaitAll(taskList.ToArray());