1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. //定义一个为可取消资源标志
  4. CancellationTokenSource cts = new CancellationTokenSource();
  5. //定义二个为可取消资源标志
  6. CancellationTokenSource cts1 = new CancellationTokenSource();
  7.  
  8. //实现一个可取消操作的回调函数,
  9. ThreadPool.QueueUserWorkItem(o => Count(cts.Token, ));
  10.  
  11. //为可取消资源标志注册取消后的回调函数(无参,无返回值,匿名委托)
  12. cts.Token.Register(() => Console.WriteLine("Canceled 1"));
  13.  
  14. //为可取消资源标志注册取消后的回调函数(有参,无返回值,显式申明委托)
  15. cts.Token.Register(o => TestCancellationMethead(, ), true);
  16.  
  17. cts1.Token.Register(() => Console.WriteLine("Canceled 2"));
  18.  
  19. ///连接两个可取消资源标志
  20. var LinkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, cts1.Token);
  21. ///给连接后的可取消资源标志集注册回调函数(匿名委托),集合中任意一个可取消资源标志取消,都将触发该回调函数
  22. LinkedCts.Token.Register(() => Console.WriteLine("linkedCts canceled"));
  23. Thread.Sleep();
  24. cts.Cancel();
  25. }
  26.  
  27. void TestCancellationMethead(int x, int y)
  28. {
  29. Console.WriteLine("取消后的回调函数" + x + y);
  30. }
  31.  
  32. /// <summary>
  33. /// 一个可取消操作的回调函数,函数的关键是传入一个CancellationToken对象
  34. /// </summary>
  35. /// <param name="token"></param>
  36. /// <param name="countTo"></param>
  37. void Count(CancellationToken token, Int32 countTo)
  38. {
  39. Console.WriteLine("一个可取消的操作开始执行");
  40. for (int count = ; count < countTo; count++)
  41. {
  42. if (token.IsCancellationRequested)
  43. {
  44. Console.WriteLine("$" + count.ToString());
  45. Console.ReadLine();
  46. break;
  47. }
  48. Console.WriteLine("|" + count.ToString());
  49. Console.ReadLine();
  50. }
  51. }
  1. bool IsCancellationRequested = false;
  2.  
  3. private void button2_Click(object sender, EventArgs e)
  4. {
  5. ThreadPool.QueueUserWorkItem(o => Count());
  6. Thread.Sleep();
  7. IsCancellationRequested = true;
  8. }
  9.  
  10. void Count(Int32 countTo)
  11. {
  12. Console.WriteLine("一个可取消的操作开始执行");
  13. for (int count = ; count < countTo; count++)
  14. {
  15. if (IsCancellationRequested)
  16. {
  17. Console.WriteLine("一个可取消的操作被取消" + count.ToString());
  18. break;
  19. }
  20. Console.WriteLine(count.ToString());
  21. }
  22. }

C# 实现一个可取消的多线程操作 示例的更多相关文章

  1. C#多线程操作界面控件的解决方案(转)

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  2. c# BackGroundWorker 多线程操作的小例子

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  3. swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)

    欢迎有兴趣的朋友,参与我的美女同事发起的活动<51天吃掉大象>,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章.关注她的微信公众号: ...

  4. 多线程操作C++ STL vector出现概率coredump问题及尽量避免锁的双缓冲队列

    多线程操作全局变量,必须考虑同步问题,否则可能出现数据不一致, 甚至触发coredump. 前段时间, 遇到一个多线程操作了全局的vector的问题,  程序崩了.场景是这样的:某全局配置参数保存在一 ...

  5. c# BackGroundWorker 多线程操作的小例子 (转)

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  6. c# Winform 多线程操作

    主要是对一个过程需要的时间很长执行时会出现界面假死的情况 方法1: Application.DoEvents(),这种方法当你拖动窗体时,界面不会假死.但在你拖动时代码不再执行,也就是阻塞了,当你不再 ...

  7. C#中级-常用多线程操作(持续更新)

    一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参 ...

  8. java多线程操作

    进程是程序的一次动态的执行过程,它经历了从代码加载.执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程. 多线程是实现并发机制的一种有效的手段.进程和线程一样,都是实现并发的一个 ...

  9. MFC的多线程操作

    记得用MFC做了一个图像自动修复软件,当时没有多线程操作这一概念,由于图像修复算法比较复杂,因此,当执行图像修复时,程序就像卡死了似得而不能做其他操作.其实MFC对这种情况有一种很好地解决方案,那就是 ...

随机推荐

  1. R语言-实用数据对象处理函数

    length(object) 显示对象中元素/成分的数量 dim(object) 显示某个对象的维度 str(object) 显示某个对象的结构 class(object) 显示某个对象的类或类型 m ...

  2. 解析JDK 7的动态类型语言支持

    http://www.infoq.com/cn/articles/jdk-dynamically-typed-language

  3. Hbase数据导入导出

    平时用于从生产环境hbase到导出数据到测试环境. 导入数据: import java.io.BufferedReader; import java.io.File; import java.io.F ...

  4. UVA 1151 买还是建(最小生成树)

    买还是建 紫书P358 [题目链接]买还是建 [题目类型]最小生成树 &题解: 这题真的心累,看了3天,最后照着码还是wa,先放lrj代码,以后再看吧 &代码: // UVa1151 ...

  5. jquery的全选插件

    全选看起来挺简单的,要做得完美就不那么容易了. 目前,我的全选插件能做到以下6点: 1.点击全选checkbox,能将要选择的checkbox都选中.去掉全选按钮,能将所有的checkbox都不选.这 ...

  6. log4cplus 直接创建logger 对象

    #include <log4cplus/loggingmacros.h> #include <log4cplus/fileappender.h> #include <lo ...

  7. redis中setbit的用法

    原文地址:http://www.zhihu.com/question/27672245 在redis中,存储的字符串都是以二级制的进行存在的.举例:设置一个 key-value ,键的名字叫“andy ...

  8. [DFNews] EnCase v7.08发布

    EnCase v7.08 近日正式发布,7.08增加了Evidence Processor Manager以及Evidence Processor,不仅可以在本地实现证据处理队列,也支持了通过网络进行 ...

  9. 经典算法C++版(参考一线码农博文)

    鉴于一线码农的算法博文基本通过C#完成,此处用C++再实现一遍,具体解法可参考其博文. 地址:http://www.cnblogs.com/huangxincheng/category/401959. ...

  10. ImageJ 学习第一篇

    ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Image ...