0

0

.NET中的CancellationToken是什么?如何优雅地取消一个长时间运行的异步任务?

畫卷琴夢

畫卷琴夢

发布时间:2025-11-24 16:04:02

|

540人浏览过

|

来源于php中文网

原创

CancellationToken是.NET中用于协作式取消异步操作的机制,由CancellationTokenSource创建,调用其Cancel()方法后,所有监听该token的操作会收到取消通知;任务需定期检查token状态并主动退出,实现优雅终止。常用于用户取消、超时中断或应用关闭等场景。使用时需将token传递给支持取消的操作,并在执行过程中通过IsCancellationRequested或ThrowIfCancellationRequested判断是否取消。示例中,LongRunningOperation循环检查token,若取消请求发出则提前结束任务。

.net中的cancellationtoken是什么?如何优雅地取消一个长时间运行的异步任务?

CancellationToken 是 .NET 中用于协作式取消异步或长时间运行操作的机制。它本身不强制终止任务,而是提供一种“通知”方式,让目标操作可以主动响应取消请求,从而实现优雅退出。

什么是 CancellationToken?

CancellationToken 通常由 CancellationTokenSource 创建。当调用 CancellationTokenSource 的 Cancel() 方法时,所有监听该 token 的操作会收到取消通知。关键在于“协作”——任务必须定期检查 token 状态并自行决定如何退出。

常用场景包括:
  • 用户点击“取消”按钮中断后台下载
  • API 请求超时自动终止
  • 应用关闭时清理正在执行的任务

如何使用 CancellationToken 取消异步任务

在实际编码中,需要将 token 传递给支持取消的操作,并在适当位置检查其状态。

笔启AI论文
笔启AI论文

专业高质量、低查重,免费论文大纲,在线AI生成原创论文,AI辅助生成论文的神器!

下载
示例:取消一个模拟的长时间异步任务
var cts = new CancellationTokenSource();
var token = cts.Token;

async Task LongRunningOperation(CancellationToken ct)
{
    for (int i = 0; i < 100; i++)
    {
        // 模拟工作
        await Task.Delay(100, ct); // 支持取消的延迟

        // 手动检查是否已取消
        ct.ThrowIfCancellationRequested();

        Console.WriteLine($"处理进度: {i + 1}%");
    }
}

// 启动任务
var task = LongRunningOperation(token);

// 模拟外部触发取消
await Task.Delay(500);
cts.Cancel(); // 发起取消请求

try
{
    await task;
}
catch (OperationCanceledException)
{
    Console.WriteLine("任务已被取消");
}

在这个例子中,Task.Delay 接收 token 并在取消时抛出异常。手动调用 ThrowIfCancellationRequested 可确保及时响应取消信号。

最佳实践与注意事项

要正确使用取消机制,需注意以下几点:

  • 始终传递 CancellationToken 到支持它的 API(如 HttpClient.GetAsync、StreamReader.ReadLineAsync)
  • 在循环中定期检查 token 状态,避免长时间阻塞无法响应取消
  • 捕获 OperationCanceledException 并区分正常取消和错误
  • 使用 using 或 try-finally 确保 CancellationTokenSource 被释放
  • 考虑设置超时:new CancellationTokenSource(TimeSpan.FromSeconds(30))
基本上就这些。CancellationToken 的设计强调协作而非强制终止,这样能避免资源泄漏或状态不一致,是实现健壮异步程序的重要工具

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6079

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

798

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1056

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1211

2024.03.01

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

106

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

64

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.6万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号