怪奇物语

怪奇物语

首页 新随笔 联系 管理

CancellationTokenSource

cts.Token的两个属性

1. CanBeCanceled

  • 含义:表示该 CancellationToken 是否可以被取消。
  • 初始状态:如果 CancellationToken 是由 CancellationTokenSource 创建的,则为 true。如果是默认构造(default(CancellationToken)),则为 false
  • 变化时机:一旦为 true,不会变为 false。即,只要 token 来源于 CancellationTokenSource,它就一直可以被取消。

2. IsCancellationRequested

  • 含义:表示是否已经请求取消。
  • 初始状态:为 false,即还没有调用 Cancel()
  • 变化时机:当调用 cts.Cancel() 时,变为 true,且之后不会再变回 false

代码

var cts = new CancellationTokenSource();

// 监控取消事件
cts.Token.Register(() => Console.WriteLine("Token 已被取消!"));

Console.WriteLine($"CanBeCanceled: {cts.Token.CanBeCanceled}"); // True
Console.WriteLine($"IsCancellationRequested: {cts.IsCancellationRequested}"); // False

// 启动一个任务,2秒后取消
_ = Task.Run(async () =>
{
    await Task.Delay(500);
    cts.Cancel();
});

while (!cts.IsCancellationRequested)
{
    Console.WriteLine($"[循环中] IsCancellationRequested: {cts.IsCancellationRequested}");
    await Task.Delay(500);
}

await Task.Delay(3000);
Console.WriteLine("主流程结束");
System.Console.Read();

  1. 输出如下,你会发现,因为是异步的,所以即使whilte的循环条件卡控!cts.IsCancellationRequested,但是在循环体内仍然会有
    cts.IsCancellationRequested = true情况出现

  2. 所以需要在while的循环体内在增加一个判断条件,

D:\Code\ServiceModel.Grpc-master\Examples\SimpleChat\CancellationTokeState>dotnet run 
CanBeCanceled: True
IsCancellationRequested: False
[循环中] IsCancellationRequested: False
                                 ♈♈♈♈
[循环中] IsCancellationRequested: True       
Token 已被取消!
主流程结束
D:\Code\ServiceModel.Grpc-master\Examples\SimpleChat\CancellationTokeState>dotnet run 
CanBeCanceled: True
IsCancellationRequested: False
                                 ♈♈♈♈
[循环中] IsCancellationRequested: False
Token 已被取消!
主流程结束
posted on 2025-06-15 08:00  超级无敌美少男战士  阅读(57)  评论(0)    收藏  举报