.net 多线程之线程取消

 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());

 

posted on 2019-04-21 08:13  雯烈  阅读(881)  评论(0编辑  收藏  举报