翼度科技»论坛 编程开发 .net 查看内容

浅谈C#中取消令牌CancellationTokenSource

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15

  • 基础操作
    1.             CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    2.             cancellationTokenSource.Token.Register(() =>
    3.             {
    4.                 Console.WriteLine("取消了1111");
    5.             });
    6.             cancellationTokenSource.Token.Register(() =>
    7.             {
    8.                 Console.WriteLine("取消了2222");
    9.             });
    10.             cancellationTokenSource.Cancel();
    复制代码
    1. 取消了2222
    2. 取消了1111
    复制代码
  • 超时自动取消

    1. new CancellationTokenSource(3000);
    复制代码
    1. cancellationTokenSource.CancelAfter(3000);
    复制代码


  • 关联取消
    1.             CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    2.             CancellationTokenSource cancellationTokenSource2 = new CancellationTokenSource();
    3.             cancellationTokenSource.Token.Register(() =>
    4.             {
    5.                 Console.WriteLine("取消了1111");
    6.             });
    7.             cancellationTokenSource2.Token.Register(() =>
    8.             {
    9.                 Console.WriteLine("取消了2222");
    10.             });
    11.             var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationTokenSource.Token,
    12.                 cancellationTokenSource2.Token);
    13.             linkedTokenSource.Token.Register(() =>
    14.             {
    15.                 Console.WriteLine("关联令牌被取消了");
    16.             });
    17.             //cancellationTokenSource.Cancel();
    18.             cancellationTokenSource2.Cancel();
    复制代码
    1. 关联令牌被取消了
    2. 取消了2222
    复制代码
    令牌1和2的任意一个取消,关联令牌linkedTokenSource就会被取消。但是关联令牌linkedTokenSource取消,令牌1和2并不会取消。
  • 判断取消
    1.             CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    2.             cancellationTokenSource.Token.Register(() =>
    3.             {
    4.                 Console.WriteLine("取消了1111");
    5.             });
    6.             Task.Run(async () =>
    7.             {
    8.                 while (!cancellationTokenSource.IsCancellationRequested)
    9.                 {
    10.                     Console.WriteLine("一直在执行...");
    11.                     await Task.Delay(1000);
    12.                 }
    13.             });
    14.             cancellationTokenSource.CancelAfter(3000);
    复制代码
    1. 一直在执行...
    2. 一直在执行...
    3. 一直在执行...
    4. 取消了1111
    复制代码
    1.             CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    2.             Task.Run(async () =>
    3.             {
    4.                 try
    5.                 {
    6.                     while (true)
    7.                     {
    8.                         //如果操作被取消则直接抛出异常
    9.                         cancellationTokenSource.Token.ThrowIfCancellationRequested();
    10.                         Console.WriteLine("一直在执行...");
    11.                         await Task.Delay(1000);
    12.                     }
    13.                 }
    14.                 catch (OperationCanceledException ex)
    15.                 {
    16.                     Console.WriteLine("取消了!");
    17.                 }
    18.             });
    19.             cancellationTokenSource.CancelAfter(3000);
    复制代码
    1. 一直在执行...
    2. 一直在执行...
    3. 一直在执行...
    4. 取消了!
    复制代码
    使用ThrowIfCancellationRequested会抛出OperationCanceledException异常,需要自己捕获处理

来源:https://www.cnblogs.com/log9527blog/archive/2023/07/21/17571326.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具