在现代C#开发中,异步编程已成为提升应用程序响应性和性能的关键技术。而当你的程序需要长时间运行的任务(如网络请求、文件读写或复杂计算)时,用户可能希望随时取消这些操作。这时,CancellationToken(取消令牌)就派上用场了。本文将手把手教你如何在C#异步方法中正确传递和使用取消令牌,即使是编程新手也能轻松掌握。
CancellationToken 是 .NET 提供的一个结构,用于通知正在运行的操作应该被取消。它通常与 CancellationTokenSource 配合使用:CancellationTokenSource 负责发出取消请求,而 CancellationToken 则被传递给异步方法,以便监听取消信号。
CancellationTokenSource 实例。CancellationToken。CancellationTokenSource.Cancel() 来触发取消。下面是一个完整的控制台应用程序示例,演示如何在异步方法中使用 取消令牌:
using System;using System.Threading;using System.Threading.Tasks;class Program{ static async Task Main(string[] args) { // 1. 创建 CancellationTokenSource var cts = new CancellationTokenSource(); // 2. 获取 CancellationToken CancellationToken token = cts.Token; // 3. 启动异步任务,并传入取消令牌 Task task = DoWorkAsync(token); // 模拟用户在3秒后按下取消键 await Task.Delay(3000); Console.WriteLine("用户请求取消操作..."); cts.Cancel(); // 4. 触发取消 try { await task; // 等待任务完成 } catch (OperationCanceledException ex) { Console.WriteLine($"任务已被取消: {ex.Message}"); } } // 5. 异步方法接收 CancellationToken 参数 static async Task DoWorkAsync(CancellationToken cancellationToken) { for (int i = 1; i <= 10; i++) { // 检查是否请求取消 cancellationToken.ThrowIfCancellationRequested(); Console.WriteLine($"正在处理第 {i} 步..."); await Task.Delay(1000, cancellationToken); // 使用带令牌的 Delay } Console.WriteLine("工作完成!"); }} OperationCanceledException。HttpClient.GetAsync、FileStream.ReadAsync 等)都原生支持取消令牌,记得传入以实现即时响应取消。OperationCanceledException 是良好实践,避免程序崩溃。在复杂的异步调用链中,你可能需要将同一个 CancellationToken 从顶层方法一路传递到底层方法。例如:
async Task TopLevelMethod(CancellationToken ct){ await MiddleLayer(ct);}async Task MiddleLayer(CancellationToken ct){ await LowLevelOperation(ct);}async Task LowLevelOperation(CancellationToken ct){ // 执行实际工作并监听 ct await Task.Delay(5000, ct);} 这样,无论在哪一层调用 Cancel(),整个调用链都能及时响应取消请求,实现高效的资源释放和用户体验优化。
通过合理使用 CancellationToken,你可以让你的 C# 应用程序更加健壮、响应迅速且用户友好。记住:在编写任何可能长时间运行的 异步方法 时,都应考虑加入取消支持。这不仅是专业开发的体现,也是提升软件质量的重要一环。
关键词回顾:C#异步方法、取消令牌、异步编程、CancellationToken
本文由主机测评网于2025-12-04发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123055.html