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号