当前位置:首页 > C# > 正文

C#取消令牌的组合使用详解(CreateLinkedTokenSource实战指南)

在 C# 异步编程中,取消令牌(CancellationToken) 是控制长时间运行任务的重要机制。然而,在复杂场景下,我们可能需要同时监听多个取消信号源。这时,CancellationTokenSource.CreateLinkedTokenSource 就派上了用场。

C#取消令牌的组合使用详解(CreateLinkedTokenSource实战指南) C#取消令牌 CancellationTokenSource CreateLinkedTokenSource 异步编程 第1张

什么是 CancellationToken 和 CancellationTokenSource?

在深入组合使用之前,先简单回顾基础概念:

  • CancellationToken:一个轻量级结构,用于传递“取消请求”信号。
  • CancellationTokenSource:用于创建 CancellationToken 并在需要时触发取消。

为什么需要 CreateLinkedTokenSource?

假设你的程序同时监听两个取消条件:

  1. 用户点击“取消”按钮(UI 取消源)
  2. 超时自动取消(定时器取消源)

你希望只要任意一个条件触发,任务就立即取消。这时候就需要将两个 CancellationToken “组合”成一个新的令牌——这正是 CreateLinkedTokenSource 的作用。

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 参数。

实际应用场景

这种技术在以下场景非常有用:

  • Web API 中同时响应客户端断开连接和服务器超时
  • 桌面应用中同时处理用户取消和后台服务超时
  • 微服务调用链中聚合多个取消信号

SEO关键词总结

本文深入讲解了 C# 中 C#取消令牌CancellationTokenSourceCreateLinkedTokenSource 的组合使用技巧,帮助开发者掌握 异步编程 中的高级取消控制模式。

通过合理使用 CreateLinkedTokenSource,你可以构建更健壮、响应更灵敏的异步应用程序。记住:良好的取消机制不仅是功能需求,更是用户体验的关键组成部分。