在C#异步编程中,取消令牌(CancellationToken)是一个非常重要的机制,它允许我们在任务执行过程中安全地请求取消操作。尤其在处理多个相互依赖的异步任务时,如何实现CancellationToken联动,让一个取消请求能同时影响多个任务,是提升程序健壮性和用户体验的关键。

CancellationToken 是 .NET 提供的一个轻量级结构,用于向正在运行的操作发出“取消请求”信号。它通常与 CancellationTokenSource 配合使用:后者负责发出取消请求,前者负责监听该请求。
在实际开发中,我们经常遇到这样的场景:一个主任务启动了多个子任务(例如下载多个文件、并行处理数据等)。如果用户点击“取消”,我们希望所有相关任务都能立即响应取消,而不是只取消其中一个。这就需要.NET异步编程中的联动取消机制。
.NET 提供了 CreateLinkedTokenSource 方法,可以将多个 CancellationToken 合并成一个新的联动令牌。只要其中任意一个原始令牌被取消,新令牌也会被取消。
var cts1 = new CancellationTokenSource();var cts2 = new CancellationTokenSource();// 创建联动取消令牌源using var linkedCts = CancellationTokenSource .CreateLinkedTokenSource(cts1.Token, cts2.Token);// 启动任务并传入联动令牌var task1 = Task.Run(async () =>{ while (!linkedCts.Token.IsCancellationRequested) { await Task.Delay(100); Console.WriteLine("任务1运行中..."); } Console.WriteLine("任务1已取消");}, linkedCts.Token);var task2 = Task.Run(async () =>{ while (!linkedCts.Token.IsCancellationRequested) { await Task.Delay(150); Console.WriteLine("任务2运行中..."); } Console.WriteLine("任务2已取消");}, linkedCts.Token);// 模拟:5秒后通过 cts1 发出取消请求await Task.Delay(5000);cts1.Cancel(); // 此时 linkedCts.Token 也会被取消await Task.WhenAll(task1, task2);在这个例子中,即使我们只调用了 cts1.Cancel(),由于 linkedCts 是由 cts1.Token 和 cts2.Token 联动创建的,所以两个任务都会收到取消信号。
虽然可以通过轮询多个令牌的 IsCancellationRequested 属性来实现类似效果,但这种方式效率低且容易出错。因此,强烈建议使用 CreateLinkedTokenSource。
CancellationToken.IsCancellationRequested 或调用 ThrowIfCancellationRequested()。using 语句确保 CancellationTokenSource 被正确释放。Task.Delay(token) 自动响应取消。掌握 C# 取消令牌的联动取消机制,是编写高质量异步代码的必备技能。通过 CancellationTokenSource.CreateLinkedTokenSource,我们可以轻松实现多个取消源的协同工作,提升程序的响应性和资源管理能力。无论你是初学者还是有经验的开发者,理解这一机制都将极大增强你在 .NET异步编程 中的控制力。
记住:良好的取消设计 = 更好的用户体验 + 更少的资源浪费。
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025126287.html