在现代C#开发中,异步编程已成为提升应用程序响应性和性能的关键手段。然而,当用户希望取消一个正在进行的操作时(比如点击“取消”按钮),我们如何优雅地终止这些异步任务?答案就是:C#取消令牌(CancellationToken)。本文将带你从零开始,掌握CancellationToken链式传递的核心技巧,让你的异步代码更加健壮、可控。
CancellationToken 是 .NET 提供的一个轻量级结构,用于在多个线程或异步操作之间传递“取消请求”。它通常与 CancellationTokenSource 配合使用:后者负责发出取消信号,前者负责监听该信号。
在复杂的异步调用链中(例如:A 调用 B,B 调用 C),如果用户在顶层请求取消,我们需要确保整个调用链都能感知到这一请求并及时退出。这就要求我们将同一个 CancellationToken 从上层逐层传递到下层——这就是所谓的链式传递。
首先,我们来看一个简单的取消令牌使用方式:
var cts = new CancellationTokenSource();// 启动一个可取消的任务Task.Run(async () =>{ try { await DoWorkAsync(cts.Token); } catch (OperationCanceledException) { Console.WriteLine("任务已被取消。"); }}, cts.Token);// 模拟用户点击“取消”await Task.Delay(1000);cts.Cancel(); // 发出取消信号 要实现 .NET异步任务取消 的链式传递,请遵循以下原则:
CancellationToken 参数。token.IsCancellationRequested 或使用支持取消的异步 API(如 HttpClient.GetAsync(token))。CancellationToken 传递下去。下面是一个三层调用的链式取消示例,展示了如何将 C#取消令牌 从顶层传递到底层:
public async Task<string> FetchUserDataAsync(CancellationToken token){ token.ThrowIfCancellationRequested(); // 调用下一层,并传递相同的 token var profile = await DownloadProfileAsync(token); var settings = await LoadUserSettingsAsync(token); return $"{profile} + {settings}";}private async Task<string> DownloadProfileAsync(CancellationToken token){ // 模拟网络请求,支持取消 await Task.Delay(2000, token); // 如果 token 被取消,此行会抛出 OperationCanceledException return "Profile Data";}private async Task<string> LoadUserSettingsAsync(CancellationToken token){ token.ThrowIfCancellationRequested(); await Task.Delay(1000, token); return "Settings Loaded";}// 使用方式var cts = new CancellationTokenSource();_ = Task.Run(async () =>{ try { var result = await FetchUserDataAsync(cts.Token); Console.WriteLine(result); } catch (OperationCanceledException) { Console.WriteLine("用户数据获取已取消。"); }});// 2秒后取消await Task.Delay(2000);cts.Cancel(); 有时你可能需要同时监听多个取消源(例如:用户取消 + 超时取消)。这时可以使用 CancellationTokenSource.CreateLinkedTokenSource:
var userCts = new CancellationTokenSource();var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5));using var linkedCts = CancellationTokenSource .CreateLinkedTokenSource(userCts.Token, timeoutCts.Token);try{ await FetchUserDataAsync(linkedCts.Token);}catch (OperationCanceledException){ if (userCts.IsCancellationRequested) Console.WriteLine("用户手动取消"); else if (timeoutCts.IsCancellationRequested) Console.WriteLine("操作超时");} CancellationToken 参数。CancellationToken,即使你暂时不使用它——为未来扩展留接口。token.ThrowIfCancellationRequested() 可以简化取消逻辑,自动抛出标准异常。通过掌握 CancellationToken链式传递,你不仅能写出更健壮的异步代码,还能显著提升用户体验——让用户随时掌控程序行为。现在就去重构你的异步方法,加入取消支持吧!
关键词回顾:C#取消令牌、CancellationToken链式传递、.NET异步任务取消、异步编程取消机制。
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126075.html