0

0

c# CancellationTokenSource.CreateLinkedTokenSource 的用法

幻夢星雲

幻夢星雲

发布时间:2026-01-04 10:41:02

|

756人浏览过

|

来源于php中文网

原创

当需要将多个 cancellationtoken 合并为“任一取消即触发”的联合令牌时,应使用 cancellationtokensource.createlinkedtokensource,典型场景包括用户主动取消、超时终止和外部健康检查三类信号的协同响应。

c# cancellationtokensource.createlinkedtokensource 的用法

什么时候该用 CancellationTokenSource.CreateLinkedTokenSource

当你需要把多个 CancellationToken 合并成一个“只要任一取消就触发”的联合令牌时,就该用它。典型场景是:一个长期运行的任务既要响应用户主动取消(比如 UI 点击“停止”),又要响应超时(比如 30 秒后自动终止),这两个信号互不依赖,但任务只需响应其中任意一个即可退出。

CreateLinkedTokenSource 的参数和常见误用

它接受一个或多个 CancellationToken 参数,返回一个新的 CancellationTokenSource,其 Token 在任一源被取消时立即变为已取消状态。注意:它不接受 CancellationTokenSource,只接受 CancellationToken;传入已取消的令牌会立刻让新源也进入取消状态;传入 default(CancellationToken) 是安全的(会被忽略)。

  • ✅ 正确:CancellationTokenSource.CreateLinkedTokenSource(userToken, timeoutToken)
  • ❌ 错误:CancellationTokenSource.CreateLinkedTokenSource(userCts.Token, null) —— null 会抛 ArgumentNullException
  • ⚠️ 隐患:如果某个传入的 Token 已经被取消,新创建的 CancellationTokenSource 会立即处于 IsCancellationRequested == true 状态,且无法再调用 Cancel()(会抛异常)

如何安全地组合用户取消 + 超时 + 外部服务健康检查

实际项目中常需叠加三类信号。关键点在于:每个信号源应独立管理生命周期,避免因某一个提前取消而意外影响其他源;链接操作应在真正启动任务前完成。

VisualizeAI
VisualizeAI

用AI把你的想法变成现实

下载
var userCts = new CancellationTokenSource();
var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
var healthCts = new CancellationTokenSource(); // 可由后台线程监听服务状态后调用 Cancel()

// 链接三个令牌
using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(
    userCts.Token,
    timeoutCts.Token,
    healthCts.Token);

try
{
    await DoWorkAsync(linkedCts.Token); // 任一信号触发,DoWorkAsync 内部应检查 Token 并及时退出
}
catch (OperationCanceledException) when (linkedCts.IsCancellationRequested)
{
    // 正常取消路径,无需重抛
}

为什么不能用 Task.WhenAny 替代?

因为语义不同:WhenAny 是等待任意一个 Task 完成,适用于并发任务协调;而 CreateLinkedTokenSource 是对取消信号做逻辑“或”合并,作用于同一个任务的协作式取消流程。前者解决“谁先做完”,后者解决“谁先喊停”。混淆会导致:

  • 无法在 DoWorkAsync 内部通过 token.ThrowIfCancellationRequested() 响应取消
  • 超时后任务仍在后台运行,资源泄漏
  • UI 点击取消按钮后界面卡顿,因为没真正中断工作流

真正难处理的是跨线程传递和持有 CancellationTokenSource 的生命周期管理——比如 healthCts 由另一个模块控制,必须确保它不会被过早 GC 或重复 Cancel。这点容易被忽略,但直接影响可靠性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

988

2024.03.01

登录token无效
登录token无效

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

6511

2023.09.14

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

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

840

2023.09.14

token怎么获取
token怎么获取

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

1088

2023.12.21

token什么意思
token什么意思

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

1805

2024.03.01

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

234

2023.12.07

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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