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实例。

  

 

posted @   Darius丶段  阅读(2995)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示