全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C# TaskCompletionSource的用法 - 将回调模式转换为async/await

TaskCompletionSource是C#中将回调式异步操作包装为可await的Task的核心工具,不执行异步逻辑,仅手动控制Task完成状态(成功/失败/取消),适用于桥接事件、回调、IAsyncResult等非Task异步模型。

的用法 - 将回调模式转换为async/await - "/>

TaskCompletionSource 是 C# 中把“回调式异步操作”包装成 Task、从而支持 await 的核心工具。它不执行任何异步逻辑,只负责手动控制一个 Task 的完成状态(成功、失败、取消)。

什么时候需要 TaskCompletionSource

常见于以下场景:

  • 调用老式 API(比如基于事件或回调的 SDK,如 WebSocket.OnMessage、HttpClient.SendAsync 的旧封装)
  • 需要自己定义异步契约,比如实现超时控制、延迟触发、信号等待(类似 ManualResetEventSlim + Task)
  • 桥接非 Task 的异步模型(如 Begin/End 模式、IAsyncResult)

基本用法:三步走

以“监听一次 WebSocket 消息”为例:

var tcs = new TaskCompletionSource();// 1. 订阅回调(比如 WebSocket 收到消息时触发)
webSocket.OnMessage += (msg) =>
{
// 2. 成功完成 Task,值为 msg
tcs.TrySetResult(msg);
};// 3. 返回可 await 的 Task
return tcs.Task;

调用方就可以这样写:

string msg = await WaitForNextMessage(); // 干净、线性、可异常传播

务必注意 TrySetXXX 的安全性

TrySetResult/TrySetException/TrySetCanceled 是线程安全且幂等的 —— 多次调用只生效第一次,不会抛异常。推荐始终用 TrySet* 系列,而不是 Set*

常见错误:

  • 重复调用 SetResult → 抛 InvalidOperationException
  • 在 Task 已完成后再设置 → 同样崩溃
  • 忘记处理异常或取消路径 → Task 永远不完成(死等)

配合 CancellationToken 实现可取消等待

不能直接取消 TaskCompletionSource 本身,但可以监听 token 并主动取消:

var tcs = new TaskCompletionSource();using var registration = cancellationToken.Register(() =>
{
tcs.TrySetCanceled(); // 注意:传入 token 可选,但建议显式传入
});// ... 后续回调中调用 TrySetResult 或 TrySetException

这样 await tcs.Task 就能响应 cancellationToken,抛出 OperationCanceledException

基本上就这些。它不复杂,但容易忽略线程安全和完成唯一性 —— 用好 TrySet* 和及时清理资源(比如注销事件),就能稳稳把回调转成 async/await。


# websocket  # 工具  # ai  # c#  # 封装  # Token  # 线程  # 事件  # 异步  # 回调  # 就能  # 它不  # 桥接  # 什么时候  # 适用于  # 可选  # 为例  # 转换为  # 抛出 


相关文章: 如何用IIS7快速搭建并优化网站站点?  如何用wdcp快速搭建高效网站?  自助网站制作软件,个人如何自助建网站?  网站企业制作流程,用什么语言做企业网站比较好?  常州企业建站如何选择最佳模板?  建站之星CMS五站合一模板配置与SEO优化指南  如何通过西部建站助手安装IIS服务器?  建站之星如何实现网站加密操作?  如何选择高效响应式自助建站源码系统?  如何通过建站之星自助学习解决操作问题?  建站主机选购指南:核心配置优化与品牌推荐方案  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速建站并高效导出源代码?  如何制作一个表白网站视频,关于勇敢表白的小标题?  全景视频制作网站有哪些,全景图怎么做成网页?  建站主机与虚拟主机有何区别?如何选择最优方案?  在线制作视频的网站有哪些,电脑如何制作视频短片?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何登录建站主机?访问步骤全解析  如何在阿里云高效完成企业建站全流程?  C#怎么使用委托和事件 C# delegate与event编程方法  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  ,网站推广常用方法?  简单实现Android验证码  建站之星多图banner生成与模板自定义指南  微课制作网站有哪些,微课网怎么进?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  高性价比服务器租赁——企业级配置与24小时运维服务  建站主机服务器选购指南:轻量应用与VPS配置解析  简历在线制作网站免费版,如何创建个人简历?  家具网站制作软件,家具厂怎么跑业务?  如何在万网ECS上快速搭建专属网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何快速搭建二级域名独立网站?  C#怎么创建控制台应用 C# Console App项目创建方法  用v-html解决Vue.js渲染中html标签不被解析的问题  Bpmn 2.0的XML文件怎么画流程图  电商平台网站制作流程,电商网站如何制作?  C++如何使用std::optional?(处理可选值)  如何在Golang中使用replace替换模块_指定本地或远程路径  韩国服务器如何优化跨境访问实现高效连接?  如何通过万网虚拟主机快速搭建网站?  定制建站策划方案_专业建站与网站建设方案一站式指南  建站之星好吗?新手能否轻松上手建站?  linux top下的 minerd 木马清除方法  宝塔Windows建站如何避免显示默认IIS页面?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  学校建站服务器如何选型才能满足性能需求? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。