C# 使用CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消

如下:我们点击一个按钮开启线程,然后点击取消按钮取消该线程的执行

  1. CancellationTokenSource cts ;
  2. /// <summary>
  3. /// 开启线程
  4. /// </summary>
  5. private void button1_Click(object sender, EventArgs e)
  6. {
  7. //重新实例化cts.Token就会不一样,不然再次点击的时候会报错,提示线程已经执行完毕
  8. cts = new CancellationTokenSource();
  9. Task task = new Task(() =>
  10. {
  11. Thread.Sleep(1500);
  12. try
  13. {
  14. cts.Token.ThrowIfCancellationRequested();
  15. MessageBox.Show("线程被执行");
  16. }
  17. catch (Exception ex)
  18. {
  19. MessageBox.Show("线程被取消");
  20. }
  21. }, cts.Token);
  22. task.Start();
  23. //如果放到这里有可能线程还没有开始执行就被取消了
  24. //cts.Cancel(true);
  25. }
  26. /// <summary>
  27. /// 取消线程
  28. /// </summary>
  29. private void button2_Click(object sender, EventArgs e)
  30. {
  31. cts.Cancel();
  32. }

  

  几点关键问题解释:

 1:为什么线程里边去调用 Thread.Sleep(1500);

          因为如果不让线程暂停一下,你在点击开启线程后。还没有来得及点击取消线程,线程都已经执行完毕了这个时候

          再去取消线程是没有什么意义的。

2: cts.Cancel()

          这句话其实只是设置一个状态,设置该对象一个熟悉为true而已,也就是设置cts.IsCancellationRequested为ture。

          所以他根本没有真正的去取消线程的执行,只是设置一个状态而已。

3:cts.Token.ThrowIfCancellationRequested();

          因为上面说的cts.Cancel()只是设置一个状态而已,线程不会真正被取消。其实线程开启后,现在都是要执行完的,

         我们并不能真正去取消线程的执行,只是从逻辑上去取消线程需要处理的逻辑。

         这句话的意思其实就是检查cts.Cancel()设置的属性状态,也就是cts.IsCancellationRequested是否为true,如果为

         true就抛出一个异常,从而终止线程的执行

         也就是说其实这句话完全可以我们自己来实现

          

 

 

同时取消多个线程:

同时取消多个线程,其实也很简单,我们不需要有多少个线程就去实例化多少个CancellationTokenSource,

多个线程绑定顶一个CancellationTokenSource的token然后调用该对象的cancel就可以同时取消多个线程了。

  1. CancellationTokenSource cts;
  2. /// <summary>
  3. /// 开启线程
  4. /// </summary>
  5. private void button1_Click(object sender, EventArgs e)
  6. {
  7. //重新实例化cts.Token就会不一样,不然再次点击的时候会报错,提示线程已经执行完毕
  8. cts = new CancellationTokenSource();
  9. for (int i = 0; i < 5; i++)
  10. {
  11. Task task = new Task((obj) =>
  12. {
  13. Thread.Sleep(1500);
  14. try
  15. {
  16. //cts.Token.ThrowIfCancellationRequested();
  17. //检查状态,检查线程是否已经被取消,如果取消则自己跑出来一个线程
  18. if (cts.Token.IsCancellationRequested)
  19. throw new OperationCanceledException();
  20. MessageBox.Show("线程" + obj + "被执行");
  21. }
  22. catch (Exception ex)
  23. {
  24. MessageBox.Show("线程" + obj + "被取消");
  25. }
  26. }, i, cts.Token);
  27. task.Start();
  28. }
  29. //如果放到这里有可能线程还没有开始执行就被取消了
  30. //cts.Cancel(true);
  31. }
  32. /// <summary>
  33. /// 取消线程
  34. /// </summary>
  35. private void button2_Click(object sender, EventArgs e)
  36. {
  37. cts.Cancel();
  38. }

 

 

(0)

相关推荐

  • C# 异步编程

    基于Task的异步编程模式(TAP)是Microsoft为.Net平台下使用Task进行编程所提供的一组建议,这种模式提供了可以被await消耗(调用)方法的APIs,并且当使用async关键字编写遵 ...

  • jmeter压测学习17-仅登陆一次(仅一次控制器)

    前言 在线程组里面写了2个接口,一个是登陆的接口获取token,另外一个是需要拿到token才能访问用户信息的接口. 我只想对第二个接口发多次请求做压测,不需要每次都去执行登陆,于是可以用到逻辑控制器 ...

  • Task 类 (System.Threading.Tasks) | Microsoft Docs

    Task 类 定义 命名空间: System.Threading.Tasks 程序集: System.Runtime.dll 表示一个异步操作. C# public class Task : IAsy ...

  • 商品房预售制“全面取消”?央媒17字回应,开发商恐难眠

    如今我们国家的房地产行业一直实行的是商品房预售制,何为商品房预售制呢?就是指房地产开发商还没有建设好房屋甚至还没有开始建设,就开始出售房子,购房者虽然花了钱,但是买到的却是期房,没法直接入住,等到约定 ...

  • 瑞典移民局支持取消工签最多只能4年的限制

    北欧模式之前报道了瑞典政府计划从今年7月20日就通过新法律,要求申请工签需要通过瑞典语言和社会知识测试(卡罗琳斯卡医学院校长抗议从7月20日起申请瑞典永居需要会瑞典语).当时就有读者提出问题:工作签证 ...

  • 缺德!一旅客向飞机扔硬币祈福致北部湾航空航班取消

    [缺德!#一旅客向飞机扔硬币祈福致航班取消# ]4月20日上午,北部湾航空官方微博披露了一旅客向飞机扔硬币"祈福"致航班取消的情况. 根据微博内容,4月16日晚19时许,北部湾航空 ...

  • JAVA多线程学习笔记整理

    多线程: 三种创建方法 继承Thread类,以线程运行内容重写run方法,创建Thread对象并用start方法启动该线程. (匿名内部类) (Lambda表达式) 实现Runable接口,以线程运行 ...

  • 青岛马拉松谜案,冠军为啥变亚军,随后又被取消资格?

    全文2546字,阅读时间预计5分钟. 5 月 4 日,2021 年青岛国际马拉松落下了大幕,但之后在冠亚军归属问题上却闹出了不小的风波.首先,撞线的选手赵长虹反倒站在了亚军的领奖台上,这件令外界匪夷所 ...

  • 课外辅导班将被取消?部分家长恐慌,成绩差的孩子还有“春天”吗?

    在大多家庭都是一个或者两个子女,生活水平也逐步提高,家长对孩子的成长都比较关注,可以说不惜时间和经济成本.过去的年代,一个家庭三四个孩子甚至更多,都是出于"放养"状态. 至于教育家 ...

  • 怎样取消会声会影时间轴上的红线

    编辑时无意在时间轴上产生标记播放的红线,播放时它只播放红线部分,不能按自己要求的位置播放. 你可以尝试以下方法取消红线,以达到自己需要播放的位置: 找到你编辑好的全部视频的最初端(最左侧),鼠标把播放 ...

  • 净利润断层板块暂时取消

    郑重提示:现在公众号的推送规则改变了,有些读者反应收不到文章推送的情况,为防止大家看不到重要的文章,大家可以点击左上方齐大总管,再点击右上角的"...",随后点设为星标就可以及时收 ...

  • 安徽一县级市医院招聘医生,报考人数不足,被迫取消或降低比例

    (健康时报记者 郝倩玉)4月22日,微信公号"无为网"发布的一则消息:2021年无为市人民医院公开招聘工作人员,因无人报考或岗位报考人数不足开考比例,经研究决定将13个岗位予以取消 ...