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

 

转载于:https://www.cnblogs.com/Spinoza/p/10743790.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值