深入了解C#的CancellationToken
创作时间:
作者:
@小白创作中心
深入了解C#的CancellationToken
引用
CSDN
1.
https://blog.csdn.net/farway000/article/details/138174167
CancellationToken是C#中用于实现异步操作取消的重要机制。本文将深入探讨CancellationToken的工作原理、使用方法以及最佳实践,帮助开发者更好地理解和应用这一机制。
CancellationToken概述
在异步编程中,长时间运行的操作需要一种机制来控制其执行流程。CancellationToken提供了一种轻量级的对象,用于协作式取消异步操作。它允许创建者向所有使用该令牌的操作发送取消请求,而每个操作则负责监听并响应这个请求。
CancellationToken的基本心智模型
- 一个对象负责创建取消令牌,并将其传递给所有需要监听取消请求的操作。
- 每个操作可以将这个令牌的副本传递给其他操作。
- 创建令牌的对象可以使用该令牌请求操作停止。
- 只有创建者可以发起取消请求,操作本身不能取消自己。
- 每个监听器都有责任注意到取消请求并做出响应。
.NET如何实现CancellationToken
.NET通过两个类来实现取消机制:
- CancellationTokenSource:负责创建取消令牌并向所有副本发送取消请求。
- CancellationToken:用于监听令牌的状态。
此外,还涉及OperationCancelledException类型,用于验证取消的来源并通知其他组件。
使用CancellationToken的示例
下面是一个使用CancellationToken的示例代码:
public async Task CancellableMethod()
{
var tokenSource = new CancellationTokenSource();
// Queue some long running tasks
for(int i = 0;i < 10;++i)
{
Task.Run(() => DoSomeWork(tokenSource.Token), tokenSource.Token);
}
// After some delay/when you want manual cancellation
tokenSource.Cancel();
}
// Runs on a different thread
public async Task DoSomeWork(CancellationToken ct)
{
int maxIterations = 100;
for(int i = 0;i < maxIterations;++i)
{
// Do some long running work
if(ct.IsCancellationRequested)
{
Console.WriteLine("Task cancelled.");
ct.ThrowIfCancellationRequested();
}
}
}
如何监听和响应取消请求
可取消操作需要确定如何正常终止并响应取消请求。通常,这包括必要的清理工作。在更复杂的情况下,可以使用ThrowIfCancellationRequested方法抛出OperationCanceledException。
监听取消请求的机制
通过轮询监听
public static void SomeLongRunningOperation(CancellationToken ct)
{
while(!ct.IsCancellationRequested)
{
DoWork(); // perform one unit of work
}
// perform cleanup if needed
}
通过注册回调监听
public static void DownloadSomeHugeFile(CancellationToken ct)
{
WebClient wc = new WebClient();
ct.Register(() =>
{
wc.CancelAsync();
});
wc.DownloadStringAsync("https://some-download-path");
}
同时监听多个令牌
可以使用CancellationTokenSource.CreateLinkedTokenSource方法将多个令牌链接到一个令牌中。
推荐的设计模式
- 知道何时已经过了不可取消的点
- 传播CancellationToken
- 完成工作后不要抛出OperationCancelledException
- 输入验证
- 考虑根本不检查令牌
取消令牌的可选参数
如果要接受CancellationToken但希望将其设为可选,可以使用如下语法:
public Task SomethingExpensiveAsync(CancellationToken cancellationToken = default(CancellationToken))
{
// don't worry about NullReferenceException if the
// caller omitted the argument because it's a struct.
cancellationToken.ThrowIfCancellationRequested();
}
如何处理取消异常
如果遇到取消,可能会遇到以下几种类型的异常:TaskCanceledException和OperationCanceledException。在编写处理已取消操作的后果的捕获块时,应捕获OperationCanceledException。
async Task SendResultAsync(CancellationToken cancellationToken)
{
try
{
await httpClient.SendAsync(form, cancellationToken);
}
catch (OperationCanceledException ex)
{
// perform your cleanup
form.Dispose();
// rethrow exception so caller knows you've canceled.
// DON'T "throw ex;" because that stomps on
// the Exception.StackTrace property.
throw;
}
}
参考资料
- Microsoft文档:取消托管线程
- 推荐模式:CancellationToken的最佳实践
- Andrew Lock的博客:在MVC控制器中使用CancellationToken
热门推荐
电炖盅使用全攻略:从选购到4款养生汤制作
打卡央视春晚同款美景:重庆云端之眼观景台全攻略
一文读懂血常规:15项关键指标解读与疾病诊断应用
立冬养生好,一冬病不找!这些保健小知识请收好
党史经典书籍推荐!这几本书,是学习党史绕不开的佳作
西安周边旅游景点全攻略:从秦始皇兵马俑到华山
冬游桐乡:一碗羊肉面里的江南古镇暖意
医院探望患者,这些问候语让你倍显贴心
贝林厄姆加盟皇马,冠军拿到手软!
贝林厄姆戴维斯迪拜派对引热议:现代足球运动员如何平衡竞技与生活?
男性如何制定个性化的健康饮食计划来提升体质与健康?
揭秘清朝侍妾的真实地位:从法律到生活的全方位剖析
西南科大核医疗废水处理技术获美国专利,填补国际空白
匈牙利迎来2025五旬节:四城特色活动喜迎八方来客
6月8日五旬节:纪念圣灵降临,全球基督徒共庆
从祛湿到提升免疫力,一文读懂藿香正气丸的功效与禁忌
东北易帜:张学良在国仇家恨中的艰难抉择
东北易帜:张学良如何在多方博弈中实现国家统一
和平精英地铁逃生全图点位解析:从金库到撤离点的制胜攻略
地铁逃生刚枪流,Mk14+M416最强搭配攻略
《和平精英》地铁逃生模式高效资源搜集攻略
中国机械工程学会发布2024年重大科学问题:高应变率下金属材料的增塑降弹机理
林志玲50岁生日首晒儿子照,10年捐建20所儿童之家
林志玲“护童计划”再行动:医疗救助与心理关怀双管齐下
糖尿病并发症治疗迎来新突破:三种新疗法带来新希望
揭秘胤禵:手握20万大军为何未推翻雍正?
雍正皇帝的这六大功绩,足以让他的后人顶礼膜拜!
攀枝花至云南石林自驾游全攻略:480公里风景如画,一天直达
营养均衡助长寿:哈佛专家推荐的健康饮食方案
攀枝花交通网络升级,南向开放加速