C#任务取消--CancellationTokenSource取消令牌源
一、概述
在讲任务取消之前,得先了解取消令牌跟取消令牌源,实现任务取消功能的就是依靠这两个。
CancellationTokenSource:取消令牌源类,拥有Cancel()方法,可以给关联的令牌发送取消信号。
CancellationToken:取消令牌,结构体,拥有ThrowIfCancellationRequested()方法可以抛出异常,让任务状态变成Canceled。
二、取消任务具体实现流程
1、声明并new创建令牌源;
var tokenSource = new CancellationTokenSource();
2、声明令牌,并关联取消令牌源;
CancellationToken ct = tokenSource.Token;
3、创建任务,通过构造函数传递令牌给任务实例,并通过委托传递令牌给任务内的执行方法(注意:令牌将传递给用户委托和任务实例,要传两次);
var longTask = new Task<int>(() => TaskMathod("Task 1", 10, ct),ct);
4、当前线程通过取消令牌源调用Cancel()方法
tokenSource.Cancel();
5、任务内通过判断是否收到取消请求,决定是否调用ThrowIfCancellationRequested()方法抛出异常取消任务
static int TaskMathod(string name,int seconds,CancellationToken token){ Console.WriteLine($"Task {name} is running on a thread, " + $"id {CurrentThread.ManagedThreadId} is threadpool thread ? " + $"{CurrentThread.IsThreadPoolThread}"); for (int i = 0; i < seconds; i++) { Sleep(TimeSpan.FromSeconds(0.5)); if (token.IsCancellationRequested) //判断是否收到取消请求 { return -1; } } return seconds * 10; }
三、注意事项
取消任务有两种方式:
1、通过从委托返回。在许多情况下,此选项就足够了。但是,以这种方式取消的任务实例将转换为 TaskStatus.RanToCompletion 状态,而不是 TaskStatus.Cancel 状态。
2、通过抛出 OperationCanceledException 并向其传递请求取消的令牌。首选的执行方法是使用 ThrowIfCancellationRequest 方法。
第一种方式可以不用传令牌给task实例。
分类:
C#线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异