当前位置: 首页 > news >正文

c# .netCreateLinkedTokenSource链接令牌,取消信号异步执行

// 心跳管理类public class WebSocketHeartbeatManager{
websocketserver.cs
_cancellationTokenSource = new CancellationTokenSource();var token = _cancellationTokenSource.Token;_heartbeatManager.StartHeartbeatService(token);_acceptTask = AcceptClientsAsync(token); //log5:websocket服务端,检测客户端连接websocketserver的主类中创建的CancellationTokenSource
public void StartHeartbeatService(CancellationToken externalToken)
{_heartbeatCts = CancellationTokenSource.CreateLinkedTokenSource(externalToken);
CreateLinkedTokenSource是什么作用

CancellationTokenSource.CreateLinkedTokenSource 方法用于创建一个与外部令牌关联的新令牌源,它在您的 WebSocket 服务中主要解决以下问题:

一、CreateLinkedTokenSource 的核心作用

  1. 令牌的隔离与组合

    • 将外部传入的 externalToken 与内部令牌源 _heartbeatCts 关联,形成 "链接令牌"
    • 当 externalToken 或 _heartbeatCts 任一被取消时,所有关联的操作都会收到取消信号
  2. 细粒度取消控制

    • 允许在不影响外部令牌的情况下,单独取消心跳服务(.NET 6+ 推荐方式):
      // 仅取消心跳服务,不影响AcceptClientsAsync
      _heartbeatCts.Cancel(); 
      
  3. 避免令牌源泄漏

    • 通过链接令牌,确保心跳服务能响应外部取消请求,同时保持自身的取消控制能力

二、关键实现原理csharp

public void StartHeartbeatService(CancellationToken externalToken)
{// 创建与externalToken链接的新令牌源_heartbeatCts = CancellationTokenSource.CreateLinkedTokenSource(externalToken);// 使用_linkedToken控制心跳任务await CheckHeartbeatsAsync(_heartbeatCts.Token);
}
catch (OperationCanceledException)
{// 无论externalToken还是_heartbeatCts被取消,都会进入此分支
}

三、典型应用场景

  1. 主服务与子服务的取消关联

    • 主服务通过 externalToken 控制整体取消
    • 子服务(心跳检测)可独立取消,不影响其他服务
  2. 多组件协作取消

    • 当 _heartbeatCts 被取消时,所有使用 _heartbeatCts.Token 的操作都会收到取消信号
    • 当外部 externalToken 被取消时,_heartbeatCts 也会自动取消

四、与直接使用 externalToken 的区别

场景直接使用 externalToken使用 CreateLinkedTokenSource
取消控制权心跳服务无法主动取消可独立取消心跳服务
外部影响心跳服务取消会影响外部令牌心跳服务取消不影响外部令牌
异常处理难以区分取消来源可通过令牌源区分取消来源

五、完整取消流程示例

  1. 主服务取消

    _cancellationTokenSource.Cancel(); // 外部令牌取消
    // 自动触发_heartbeatCts取消,心跳服务终止
    
  2. 心跳服务独立取消

    _heartbeatManager.StopHeartbeatService(); // 内部取消
    // _acceptTask仍可继续运行,不受影响
    
  3. 资源释放顺序

    主服务取消

    externalToken取消

    _heartbeatCts自动取消

    心跳任务终止

    释放心跳相关资源

六、最佳实践建议

  1. 明确取消范围

    • 使用 CreateLinkedTokenSource 时,始终确保:
      _heartbeatCts = CancellationTokenSource.CreateLinkedTokenSource(externalToken);
      

      避免直接使用 externalToken 注册取消回调,防止意外影响主流程

  2. 异常处理优化

    try
    {await CheckHeartbeatsAsync(_heartbeatCts.Token);
    }
    catch (OperationCanceledException)
    {if (_heartbeatCts.IsCancellationRequested)Console.WriteLine("心跳服务主动取消");elseConsole.WriteLine("主服务取消导致心跳终止");
    }
    

    资源清理

  3. public void Dispose()
    {_heartbeatCts?.Cancel();_heartbeatCts?.Dispose();
    }
    

通过 CreateLinkedTokenSource,您的心跳服务能够更灵活地响应取消请求,同时保持与主服务的取消关联,这是现代异步编程中处理复杂取消逻辑的最佳实践。

http://www.lqws.cn/news/475327.html

相关文章:

  • 二、海思网卡数据流程
  • 多源异构数据接入与实时分析:衡石科技的技术突破
  • 虚拟与现实交融视角下定制开发开源AI智能名片S2B2C商城小程序赋能新零售商业形态研究
  • 【node】Mac m1 安装nvm 和node
  • Vulkan 学习笔记15—Mipmap 与多重采样
  • Vue3+TypeScript+Element Plus 表格展开行优化方案
  • MongoDB:索引
  • 【机器学习的五大核心步骤】从零构建一个智能系统
  • Linux 服务器运维:磁盘管理与网络配置
  • go excel解析库xuri/excelize中的SAX
  • LLMs之Embedding:Qwen3 Embedding的简介、安装和使用方法、案例应用之详细攻略
  • 【weaviate】分布式数据写入之LSM树深度解析:读写放大的权衡
  • 数据库(1)-SQL
  • webpack+vite前端构建工具 -6从loader本质看各种语言处理 7webpack处理html
  • 案例:塔能科技以“数字光网”重塑某市照明绿色生态
  • Docker 运行RAGFlow 搭建RAG知识库
  • LeapMotion-PhysicalHandsManager 类详解
  • 7.5.1散列表的基本概念
  • 测试工程师实战:用 LangChain+deepseek构建多轮对话测试辅助聊天机器人
  • 深入解析Flink Local模式启动流程源码:揭开作业初始化的神秘面纱
  • vue3 el-table 行颜色根据 字段改变
  • 企业级安全实践:SSL 加密与权限管理(二)
  • python 常见数学公式函数使用详解
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十六) -> 配置构建(三)
  • swift-17-字面量协议、模式匹配、条件编译
  • Java 21 的虚拟线程与桥接模式:构建高性能并发系统
  • Kafka Streams入门与实战:从概念解析到程序开发
  • 架构总结记录
  • VSCode性能调优:从卡顿到丝滑的终极方案
  • C++法则11:没有“顶层 const 引用“