C# CancellationToken 深度解析:原理、使用场景与最佳实践
创作时间:
作者:
@小白创作中心
C# CancellationToken 深度解析:原理、使用场景与最佳实践
引用
CSDN
1.
https://blog.csdn.net/farway000/article/details/138174167
CancellationToken是C#异步编程中用于控制异步操作取消的重要机制。本文将深入解析CancellationToken的工作原理、使用场景以及最佳实践,帮助开发者更好地理解和应用这一机制。
什么是CancellationToken?
在C#中,异步编程通常涉及长时间运行的操作,而CancellationToken提供了一种轻量级的协作取消机制。它允许创建者向所有相关操作发送取消请求,而每个操作则负责以适当的方式响应这个请求。
基本心智模型
- 创建者:使用
CancellationTokenSource创建取消令牌,并在需要时调用Cancel方法。 - 监听者:接收令牌并监控其状态,通过检查
IsCancellationRequested属性或注册回调等方式响应取消请求。
.NET的实现
.NET通过两个类来实现取消机制:
- CancellationTokenSource:负责创建取消令牌并发送取消请求。
- CancellationToken:用于监听取消状态。
此外,监听者还可以选择抛出OperationCancelledException异常,以明确表示取消操作。
使用示例
下面是一个使用CancellationToken的示例代码:
public async Task CancellableMethod()
{
var tokenSource = new CancellationTokenSource();
for (int i = 0; i < 10; ++i)
{
Task.Run(() => DoSomeWork(tokenSource.Token), tokenSource.Token);
}
tokenSource.Cancel();
}
public async Task DoSomeWork(CancellationToken ct)
{
int maxIterations = 100;
for (int i = 0; i < maxIterations; ++i)
{
if (ct.IsCancellationRequested)
{
Console.WriteLine("Task cancelled.");
ct.ThrowIfCancellationRequested();
}
}
}
监听和响应取消请求
监听者可以采用以下几种方式监听取消请求:
- 轮询:定期检查
IsCancellationRequested属性。 - 注册回调:使用
Register方法注册回调函数。 - 等待句柄:使用等待句柄(本文未详细展开)。
同时监听多个令牌
可以使用CancellationTokenSource.CreateLinkedTokenSource方法将多个令牌链接在一起,从而同时监听多个取消源。
推荐模式
- 知道何时已过不可取消点:如果操作已经产生副作用,应确保在取消时能够恢复到一致状态。
- 传播CancellationToken:将令牌传递给所有接受它的方法。
- 完成工作后不要抛出OperationCancelledException:返回成功结果,让调用方决定后续操作。
- 输入验证:在取消检查之前进行输入验证。
- 考虑不检查令牌:如果工作量很小,可以省略显式检查。
处理取消异常
- 捕获OperationCanceledException:确保正确处理取消异常,避免遗漏。
- 清理和重新抛出:在需要清理的情况下,确保正确重新抛出异常。
参考资料
- Microsoft官方文档:取消托管线程
- CancellationToken的最佳实践
- Andrew Lock的博客:在MVC控制器中使用CancellationToken
总结
本文详细介绍了CancellationToken的工作原理、使用方法以及最佳实践,对于希望深入理解C#异步编程的开发者来说,是一篇非常有价值的参考文章。
热门推荐
2025春节旅游消费观察:昆明南屏步行街客流量位居全国第七
童年的阴影与成年的紧张:批判教育的反思
2024最美录取通知书:科技与人文的完美融合
草酸的4大误区,很多人都踩了!别再只知道焯水了
梦见有人请你喝普洱茶的含义:梦境解析与心理洞察
《是王者啊》第四季太搞笑了,云缨表情古怪,简直就是本剧的活宝
任正非:“三碗不过岗”,这是华为的一个原则!
从“出圈”到“出海”,萍乡武功山凭什么?
“舔狗经济”退烧,拒绝PUA
2025年春夏,不再是“低调奢华”潮流,柔和色彩和复古碎花太好看
周有光:现代汉字学的开创者与汉语拼音之父
软考高项考试备考指南:从考试概况到论文写作
俄罗斯方块
青岛西海岸新区琅琊镇:文旅融合赋能乡村振兴
当AI让逝去的亲人动起来,家人瞬间泪奔...
羽毛球击球拍面及拍面的控制 指球拍与球托的接触方式
那个建造“斯坦福监狱”的人,离开了
一元纸币的秘密:被隐藏的含义与未公开的知识
加拿大开眼镜店需要什么
PVE服务器探秘:在奇幻世界中与环境共舞的冒险之旅
易经六十四卦之水雷屯卦:详细解析与生活启示
日常生活照片,就该松弛自在,11个拍照动作快来学
亚硝酸钾的简介和应用
河南9个小众景区,人少景美,旅游散心好去处
13部经典动漫推荐,你看过几部?
借助思维导图突破求小数近似数最值的难点
遵义辣椒产业:从自给自足到全国知名品牌
血液渗透压低至274严重吗
团播:内娱偶像的新出路?
百香籽的产地、用途及营养价值(探索这颗鲜艳多彩的种子)