WebEnh

.net7 mvc jquery bootstrap json 学习中 第一次学PHP,正在研究中。自学进行时... ... 我的博客 https://enhweb.github.io/ 不错的皮肤:darkgreentrip,iMetro_HD
随笔 - 1079, 文章 - 1, 评论 - 75, 阅读 - 174万
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

浅谈C#中取消令牌CancellationTokenSource

Posted on   WebEnh  阅读(149)  评论(0编辑  收藏  举报
  • 基础操作
    复制代码
    复制代码
                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异常,需要自己捕获处理

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

了解更多