浅谈C#中取消令牌CancellationTokenSource

  • 基础操作
                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异常,需要自己捕获处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值