.NET CancellationTokenSource 取消任务用法详解
Cancel不代表终止代码
不要想当然地依靠Cancel机制“terminate a Task”,这是做不到的!
一个常见的误解是取消了一个任务后,该任务就会自动停止;但其实这种理解是不正确的;试想一下,如果取消真的可以达到terminate一个Task的效果,那它和危险的Thread.Abort有什么区别呢?因为真的按照“cancel即在Task代码内部抛出异常”去理解,那么你没有对结束后的程序状态有任何扫尾工作。
所以CancellationTokenSource
抑或其对应的CancellationToken
都只是发一个通知给Task:你可以结束了;而具体怎样捕获这个消息并响应,是Task的用户代码自己思考的问题。
参考原文中的代码,关键的一个片段是:
if (ct.IsCancellationRequested)
{
Console.WriteLine("Task {0} cancelled", taskNum);
ct.ThrowIfCancellationRequested();
}
这类似于软件工程中的“埋点”,即在关键的代码行中插入监控代码,判断任务是否被取消
WhenAny或Wait(token)会导致异常抛出
看回原文中的代码:
try
{
await Task.WhenAll(tasks.ToArray());
}
catch (OperationCanceledException)
{
Console.WriteLine($"\n{nameof(OperationCanceledException)} thrown\n");
}
一旦任务取消,那么Task.WhenAll
会导致异常抛出;这里是非常容易误导人的一点:Task内部也发生了异常,从而打断的Task内部代码流,从而令任务强制退出了吗?
答案是:Task本身代码运行只受到自己内部代码控制,不可能单单因为CancellationTokenSource
发出了取消信号,就终端了任务的运行。
作者:虾米哥
微信公众号:IT虾米,左侧为二维码
个人技术网站-IT虾米网:http://www.itxm.cn
个人技术网站-编程符号网:http://www.itfh.cn
个人技术网站-IT干货网:http://www.itgh.cn
新浪微博:https://weibo.com/u/2814576687
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人