private void button1_Click(object sender, EventArgs e)
{
//定义一个为可取消资源标志
CancellationTokenSource cts = new CancellationTokenSource();
//定义二个为可取消资源标志
CancellationTokenSource cts1 = new CancellationTokenSource(); //实现一个可取消操作的回调函数,
ThreadPool.QueueUserWorkItem(o => Count(cts.Token, )); //为可取消资源标志注册取消后的回调函数(无参,无返回值,匿名委托)
cts.Token.Register(() => Console.WriteLine("Canceled 1")); //为可取消资源标志注册取消后的回调函数(有参,无返回值,显式申明委托)
cts.Token.Register(o => TestCancellationMethead(, ), true); cts1.Token.Register(() => Console.WriteLine("Canceled 2")); ///连接两个可取消资源标志
var LinkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, cts1.Token);
///给连接后的可取消资源标志集注册回调函数(匿名委托),集合中任意一个可取消资源标志取消,都将触发该回调函数
LinkedCts.Token.Register(() => Console.WriteLine("linkedCts canceled"));
Thread.Sleep();
cts.Cancel();
} void TestCancellationMethead(int x, int y)
{
Console.WriteLine("取消后的回调函数" + x + y);
} /// <summary>
/// 一个可取消操作的回调函数,函数的关键是传入一个CancellationToken对象
/// </summary>
/// <param name="token"></param>
/// <param name="countTo"></param>
void Count(CancellationToken token, Int32 countTo)
{
Console.WriteLine("一个可取消的操作开始执行");
for (int count = ; count < countTo; count++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("$" + count.ToString());
Console.ReadLine();
break;
}
Console.WriteLine("|" + count.ToString());
Console.ReadLine();
}
}
        bool IsCancellationRequested = false;

        private void button2_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(o => Count());
Thread.Sleep();
IsCancellationRequested = true;
} void Count(Int32 countTo)
{
Console.WriteLine("一个可取消的操作开始执行");
for (int count = ; count < countTo; count++)
{
if (IsCancellationRequested)
{
Console.WriteLine("一个可取消的操作被取消" + count.ToString());
break;
}
Console.WriteLine(count.ToString());
}
}

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. FlashBuilder 新建项目时提示 java.lang.nullpointerexception

    可以尝试安装 Air SDK

  2. C# webbrowser实现真正意义上的F5刷新

    关于webbrowser的刷新在C#中有提供方便的方法: webbrowser.refresh(); 但是有时候会发现,不给力啊 那怎么办? 还有一招: webBrowser1.Document.Ex ...

  3. [HTML5]HTML结构性元素(Structure)

    参考自:http://techbrood.com/h5b2a?p=html-structure 结构性元素用来组织文档的各个部分 为了让文档层次分明,我们可以把文档中的元素按其内容的作用进行组合,这就 ...

  4. 关于<meta http-equiv="X-UA-Compatible" content="IE=edge" />问题

    我在做网页过程中都是在火狐浏览器下进行的,可是有一次我在IE浏览器下打开时却发现我设置的style.css中的大部分样式都失效率了,这个问题足足困扰了我两天,终于在百度的帮助下找到了答案,原来在网页的 ...

  5. 总结一下响应式设计的核心CSS技术Media(媒体查询器)的用法。(转)

    <meta http-equiv="X-UA-Compatible" content="IE=edge"><!--兼容ie-->< ...

  6. Spring AOP 由浅入深

    (分析基于Spring的版本:version = 4.1.6.RELEASE) Spring AOP工厂: org.springframework.aop.framework.DefaultAopPr ...

  7. memcpy和memmove

    memcpy函数 函数原型 void *memcpy(void *dest, const void *src, size_t n); dest:目标地址 src: 起始地址 n: 字节数 头文件 st ...

  8. python用迭代器方式便利目录下的文件

    from pathlib import Path pths = [pth for pth in Path.cwd().iterdir()] 如果是os.listdir()这会返回一个list,文件非常 ...

  9. 入手《C#入门经典(第6版)》,据说今天是读书日

    亚马逊上买的,75.3RMB,放进心愿单那么久都没人送我,太杯具了.为了表扬自己学习完前7章内容,提高后面的学习效率和质量,果断入手,嘿嘿. 预防自己买了书就不看的毛病,下定决心,每天阅读2-3小时. ...

  10. 从零开始,教你用Webpack构建React基础工程

    参考 http://www.jianshu.com/p/4df92c335617