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();
- 
输出如下,你会发现,因为是异步的,所以即使whilte的循环条件卡控
!cts.IsCancellationRequested,但是在循环体内仍然会有
cts.IsCancellationRequested = true情况出现 - 
所以需要在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 已被取消!
主流程结束
                    
                
                
                
            
        
浙公网安备 33010602011771号