1. TaskCompletionSource核心机制解析
TaskCompletionSource(简称TCS)是.NET异步编程模型中的关键组件,它本质上是一个任务控制器,允许开发者手动控制Task的生命周期状态。与常规async/await生成的Task不同,TCS提供了对任务状态的完全掌控权。
1.1 核心工作原理
TCS通过内部维护的状态机实现任务控制,其核心机制包含三个要素:
- 任务绑定:每个TCS实例关联一个不可变的Task对象
- 状态转换:通过SetResult/SetException等方法改变任务状态
- 同步控制:确保状态变更的线程安全性
典型的工作流程如下:
csharp复制var tcs = new TaskCompletionSource<bool>();
// 后台操作完成后
ThreadPool.QueueUserWorkItem(_ => {
try {
// 模拟耗时操作
Thread.Sleep(1000);
tcs.SetResult(true); // 状态变为RanToCompletion
} catch(Exception ex) {
tcs.SetException(ex); // 状态变为Faulted
}
});
return tcs.Task; // 返回关联的Task
1.2 与普通Task的对比
| 特性 | 常规async Task | TaskCompletionSource |
|---|---|---|
| 状态控制 | 编译器自动管理 | 手动控制 |
| 适用场景 | 线性异步逻辑 | 事件/回调驱动 |
| 异常传播 | 自动捕获 | 需手动设置 |
| 取消支持 | 通过CancellationToken | 需自行实现 |
| 性能开销 | 较高 | 较低 |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键API深度剖析
2.1 状态控制方法
TCS提供四种核心状态变更方法:
-
SetResult:标记任务成功完成
- 触发Task的IsCompleted状态
- 执行所有已注册的ContinueWith回调
- 注意:只能调用一次,重复调用会抛出异常
-
SetException:标记任务失败
- 异常信息会包装在AggregateException中
- 典型使用模式:
csharp复制try { // 业务逻辑 } catch (Exception ex) { tcs.SetException(ex); } `
