CancellationToken是.NET中用于协作式取消异步操作的机制,由CancellationTokenSource创建,调用其Cancel()方法后,所有监听该token的操作会收到取消通知;任务需定期检查token状态并主动退出,实现优雅终止。常用于用户取消、超时中断或应用关闭等场景。使用时需将token传递给支持取消的操作,并在执行过程中通过IsCancellationRequested或ThrowIfCancellationRequested判断是否取消。示例中,LongRunningOperation循环检查token,若取消请求发出则提前结束任务。

CancellationToken 是 .NET 中用于协作式取消异步或长时间运行操作的机制。它本身不强制终止任务,而是提供一种“通知”方式,让目标操作可以主动响应取消请求,从而实现优雅退出。
什么是 CancellationToken?
CancellationToken 通常由 CancellationTokenSource 创建。当调用 CancellationTokenSource 的 Cancel() 方法时,所有监听该 token 的操作会收到取消通知。关键在于“协作”——任务必须定期检查 token 状态并自行决定如何退出。
常用场景包括:用户点击“取消”按钮中断后台下载 API 请求超时自动终止 应用关闭时清理正在执行的任务
如何使用 CancellationToken 取消异步任务?
在实际编码中,需要将 token 传递给支持取消的操作,并在适当位置检查其状态。
示例:取消一个模拟的长时间异步任务
var cts = new CancellationTokenSource();var token = cts.Token;async Task LongRunningOperation(CancellationToken ct){ for (int i = 0; i < 100; i++) { // 模拟工作 await Task.Delay(100, ct); // 支持取消的延迟 // 手动检查是否已取消 ct.ThrowIfCancellationRequested(); Console.WriteLine($"处理进度: {i + 1}%"); }}// 启动任务var task = LongRunningOperation(token);// 模拟外部触发取消await Task.Delay(500);cts.Cancel(); // 发起取消请求try{ await task;}catch (OperationCanceledException){ Console.WriteLine("任务已被取消");}
在这个例子中,Task.Delay 接收 token 并在取消时抛出异常。手动调用 ThrowIfCancellationRequested 可确保及时响应取消信号。
最佳实践与注意事项
要正确使用取消机制,需注意以下几点:
始终传递 CancellationToken 到支持它的 API(如 HttpClient.GetAsync、StreamReader.ReadLineAsync) 在循环中定期检查 token 状态,避免长时间阻塞无法响应取消 捕获 OperationCanceledException 并区分正常取消和错误 使用 using 或 try-finally 确保 CancellationTokenSource 被释放 考虑设置超时:new CancellationTokenSource(TimeSpan.FromSeconds(30))基本上就这些。CancellationToken 的设计强调协作而非强制终止,这样能避免资源泄漏或状态不一致,是实现健壮异步程序的重要工具。
以上就是.NET中的CancellationToken是什么?如何优雅地取消一个长时间运行的异步任务?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442158.html
微信扫一扫
支付宝扫一扫