在 C# 异步编程中,取消令牌(CancellationToken) 是控制长时间运行任务的重要机制。然而,在复杂场景下,我们可能需要同时监听多个取消信号源。这时,CancellationTokenSource.CreateLinkedTokenSource 就派上了用场。
在深入组合使用之前,先简单回顾基础概念:
CancellationToken:一个轻量级结构,用于传递“取消请求”信号。CancellationTokenSource:用于创建 CancellationToken 并在需要时触发取消。假设你的程序同时监听两个取消条件:
你希望只要任意一个条件触发,任务就立即取消。这时候就需要将两个 CancellationToken “组合”成一个新的令牌——这正是 CreateLinkedTokenSource 的作用。
CreateLinkedTokenSource 接收一个或多个 CancellationToken,返回一个新的 CancellationTokenSource。当任一输入令牌被取消时,新令牌也会被取消。
using System;using System.Threading;using System.Threading.Tasks;class Program{ static async Task Main(string[] args) { // 创建两个独立的取消源 var userCancelSource = new CancellationTokenSource(); var timeoutCancelSource = new CancellationTokenSource(); // 模拟用户5秒后点击取消 _ = Task.Run(async () => { await Task.Delay(5000); Console.WriteLine("用户点击了取消!"); userCancelSource.Cancel(); }); // 设置10秒超时 timeoutCancelSource.CancelAfter(10000); // 组合两个取消令牌 using var linkedSource = CancellationTokenSource .CreateLinkedTokenSource( userCancelSource.Token, timeoutCancelSource.Token ); try { await DoLongRunningWork(linkedSource.Token); } catch (OperationCanceledException ex) { Console.WriteLine($"任务被取消:{ex.Message}"); } finally { // 清理资源 userCancelSource.Dispose(); timeoutCancelSource.Dispose(); } } static async Task DoLongRunningWork(CancellationToken token) { for (int i = 0; i < 100; i++) { // 检查是否被取消 token.ThrowIfCancellationRequested(); Console.WriteLine($"正在处理第 {i + 1} 步..."); await Task.Delay(500, token); // 支持取消的延迟 } Console.WriteLine("任务完成!"); }} using 或手动调用 Dispose() 避免内存泄漏。CreateLinkedTokenSource 可接受两个或更多 CancellationToken 参数。这种技术在以下场景非常有用:
本文深入讲解了 C# 中 C#取消令牌、CancellationTokenSource、CreateLinkedTokenSource 的组合使用技巧,帮助开发者掌握 异步编程 中的高级取消控制模式。
通过合理使用 CreateLinkedTokenSource,你可以构建更健壮、响应更灵敏的异步应用程序。记住:良好的取消机制不仅是功能需求,更是用户体验的关键组成部分。
本文由主机测评网于2025-12-05发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123266.html