• 基础操作

                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    cancellationTokenSource.Token.Register(() =>
    {
    Console.WriteLine("取消了1111");
    });
    cancellationTokenSource.Token.Register(() =>
    {
    Console.WriteLine("取消了2222");
    });
    cancellationTokenSource.Cancel();
    取消了2222
    取消了1111
  • 超时自动取消
  1. new CancellationTokenSource(3000);
  2. cancellationTokenSource.CancelAfter(3000);
  • 关联取消

                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    CancellationTokenSource cancellationTokenSource2 = new CancellationTokenSource();
    cancellationTokenSource.Token.Register(() =>
    {
    Console.WriteLine("取消了1111");
    });
    cancellationTokenSource2.Token.Register(() =>
    {
    Console.WriteLine("取消了2222");
    });
    var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationTokenSource.Token,
    cancellationTokenSource2.Token);
    linkedTokenSource.Token.Register(() =>
    {
    Console.WriteLine("关联令牌被取消了");
    });
    //cancellationTokenSource.Cancel();
    cancellationTokenSource2.Cancel();
    关联令牌被取消了
    取消了2222
    令牌1和2的任意一个取消,关联令牌linkedTokenSource就会被取消。但是关联令牌linkedTokenSource取消,令牌1和2并不会取消。
  • 判断取消
                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    cancellationTokenSource.Token.Register(() =>
    {
    Console.WriteLine("取消了1111");
    });
    Task.Run(async () =>
    {
    while (!cancellationTokenSource.IsCancellationRequested)
    {
    Console.WriteLine("一直在执行...");
    await Task.Delay(1000);
    }
    });
    cancellationTokenSource.CancelAfter(3000);
    一直在执行...
    一直在执行...
    一直在执行...
    取消了1111
                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    Task.Run(async () =>
    {
    try
    {
    while (true)
    {
    //如果操作被取消则直接抛出异常
    cancellationTokenSource.Token.ThrowIfCancellationRequested();
    Console.WriteLine("一直在执行...");
    await Task.Delay(1000);
    }
    }
    catch (OperationCanceledException ex)
    {
    Console.WriteLine("取消了!");
    }
    });
    cancellationTokenSource.CancelAfter(3000);
    一直在执行...
    一直在执行...
    一直在执行...
    取消了!

    使用ThrowIfCancellationRequested会抛出OperationCanceledException异常,需要自己捕获处理

浅谈C#中取消令牌CancellationTokenSource的更多相关文章

  1. 浅谈C#取消令牌CancellationTokenSource

    前言 相信大家在使用C#进行开发的时候,特别是使用异步的场景,多多少少会接触到CancellationTokenSource.看名字就知道它和取消异步任务相关的,而且一看便知大名鼎鼎的Cancella ...

  2. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  3. 浅谈 HTTP中Get与Post的区别

    浅谈 HTTP中Get与Post的区别 存在的误区 有人说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹 ...

  4. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  5. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  6. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  7. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  8. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  9. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  10. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

随机推荐

  1. HarmonyOS网络管理开发—Socket连接

      简介 Socket连接主要是通过Socket进行数据传输,支持TCP/UDP/TLS协议. 基本概念 ● Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. ●  ...

  2. 【VMware vCenter】使用Reduced Downtime Update (RDU)升级更新vCenter Server。

    Reduced Downtime Upgrade (RDU) 减少停机时间更新是用于vCenter Server更新升级的一种新的方式,顾名思义,主要目的就是为了减少在vCenter Server更新 ...

  3. 重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]

    前言 佛洛伊德算法和迪杰斯特拉算法非常像,但是它求的是任何一个点到其他点之间的距离. 假设有一张图: 转换为矩阵为: 他们的前驱为: 可能上面表述前驱不清楚,举个例子. 看下图: 这第二种图表示,从A ...

  4. Linux systemd 定时任务

    哈喽大家好,我是咸鱼. 说到 Linux 定时任务,大家用得最多的就是 crond 服务,但其实 systemd 也有类似的功能.我们不但可以通过 systemd 来管理服务,还能设置定时任务,那就是 ...

  5. 力扣461(java)-汉明距离(简单)

    题目: 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目. 给你两个整数 x 和 y,计算并返回它们之间的汉明距离. 示例 1: 输入:x = 1, y = 4输出:2解释:1 ...

  6. 收藏!这些IDE使用技巧,你都知道吗

    简介: 欲善其事,先利其器.对于研发同学,在日常的开发工作中,我们与之打交道最多的便是编程的IDE.能否高效和灵活的使用IDE,将对我们的工作效率起着举足轻重的作用. 一 .背景 1 .目的 欲善其事 ...

  7. [FAQ] 修改了Dockerfile 之后,运行 docker-compose up --force-recreate 时还是报之前构建时的错误?

      因为 Docker Compose 的 --force-recreate 选项只会强制重新创建容器,而不会重新构建镜像. 因此,如果你修改了Dockerfile,需要确保重新构建新的镜像. 你可以 ...

  8. [FE] uViewUI u-navbar 曲线解决 uni onNavigationBarButtonTap 的限制与失效

    uni 自带的 navigation bar 对于普通的导航需求是够用的,也允许 onNavigationBarButtonTap 加点击事件. 但是会出现异常Bug,表现为在内部页面一番操作后,再返 ...

  9. WPF 更改 DrawingVisual 的 RenderOpen 用到的对象的内容将持续影响渲染效果

    在 WPF 里面,可以通过 DrawingVisual 来进行使用底层的绘制方法,此方法需要调用 DrawingVisual 的 RenderOpen 拿到 DrawingContext 类型的对象, ...

  10. 使用AI在原神里自动钓鱼,扫描Git仓库泄露的密码 【蛮三刀酱的Github周刊第三期】

    大家好,这里是的Github精彩项目分享周刊,我是每周都在搬砖的蛮三刀酱. 我会从Github热门趋势榜里选出 高质量.有趣,牛B 的开源项目进行分享. 榜单取自实时Github Trending排行 ...