C#中异步任务取消:CancellationToken
目录
典型写法(直接记)
详细使用方法
示例1:基本取消操作
示例2:task版本的并发取消和超时控制
注意:
常用写法
写法1:必需参数(推荐内部使用)
写法2:可选参数(异步任务的重载)
任务取消时的对策
提前返回
记得善后
1. 使用 try-catch-finally 或 using
2. 使用 token.Register() 注册取消回调
实际使用示例
推荐异步方法都带上 CancellationToken 这一传参。可以不用,但你不能没有!!
典型写法(直接记)
// 1. CancellationTokenSource - 取消令牌的发布者 常规写法直接记
var cts = new CancellationTokenSource();// 2. CancellationToken - 取消令牌本身
CancellationToken token = cts.Token;// 3. 发起取消请求
cts.Cancel();// 4. 检查是否被取消
if (token.IsCancellationRequested)
{// 处理取消逻辑
}
详细使用方法
示例1:基本取消操作
async void Main()
{var cts = new CancellationTokenSource();try{// 创建一个10秒的延迟任务,支持取消var task = Task.Delay(10000, cts.Token);// 主线程等待2秒Thread.Sleep(2000);// 2秒后取消任务cts.Cancel();// 等待任务完成(会抛出取消异常)await task;}catch (TaskCanceledException ex){ex.Message.Dump("我被取消了");}finally{cts?.Dispose(); // 释放资源}
}
示例2:task版本的并发取消和超时控制
async void Main()
{var cts = new CancellationTokenSource();var token = cts.Token;var sw = Stopwatch.StartNew();try{// 创建一个2秒后自动取消的任务var cancelTask = Task.Run(async () => {await Task.Delay(2000);cts.Cancel();});// 创建一个5秒的延迟任务(会在2秒时被取消)var delayTask = Task.Delay(5000, token);// 等待延迟任务(会被取消)