C# CancellationToken的使用小结

 更新时间:2025年11月10日 09:55:08   作者:siyun.chen  
在C#中CancellationToken是用于实现协作式取消的核心类型,本文就来详细的介绍一下C# CancellationToken的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 C# 中,CancellationToken 是用于实现 协作式取消(Cooperative Cancellation) 的核心类型,主要应用于异步操作、多线程任务或长时间运行的任务。以下是详细的讲解:

1. 核心概念

  • 作用:允许一个任务/操作在外部被请求取消,任务自身会定期检查是否被取消请求,实现优雅终止。
  • 协作式:任务需要主动配合检查取消请求(不能强行终止线程)。
  • 组成
    • CancellationTokenSource:生成和管理 CancellationToken 的类。
    • CancellationToken:传递给任务的结构体,用于传递“取消信号”。

2. 基本用法

步骤 1:创建 CancellationTokenSource 和 Token

var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

步骤 2:将 Token 传递给任务

Task.Run(() => 
{
    // 任务逻辑
}, token);

步骤 3:触发取消

cts.Cancel(); // 请求取消所有关联 Token 的任务

3. 在任务中处理取消

轮询检查 Token

public void LongRunningOperation(CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
        // 持续工作...
        Thread.Sleep(1000);
    }

    // 清理资源,优雅退出
    Console.WriteLine("操作被取消。");
}

抛出取消异常

当需要直接终止操作时,可以通过抛出 OperationCanceledException 来快速响应取消请求:

token.ThrowIfCancellationRequested(); // 如果取消已请求,抛出异常

4. 高级特性

注册取消回调

当取消被触发时,执行指定的回调函数(如释放资源):

token.Register(() => 
{
    Console.WriteLine("清理资源,取消已触发!");
});

超时自动取消

利用 CancellationTokenSource 设置超时时间,自动触发取消:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); // 5秒后自动取消

组合 Token(链接)

将多个 CancellationToken 组合成一个,任一触发则全部取消:

var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(token1, token2);
var linkedToken = linkedCts.Token;

5. 异常处理

取消操作通常会引发两种异常:

  • OperationCanceledException
  • TaskCanceledException(继承自前者)

示例

try
{
    await SomeAsyncMethod(token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("操作已被取消。");
}

6. 最佳实践

  1. 及时传递 Token:将 CancellationToken 传递给所有需要支持取消的方法。
  2. 避免阻塞操作:在非异步代码中定期检查 IsCancellationRequested
  3. 正确处理异常:不滥用 try-catch 忽略取消异常。
  4. 释放资源:确保在取消后清理打开的资源(如文件句柄、网络连接)。

7. 使用场景

  • 用户取消操作(如界面上的“取消”按钮)。
  • 服务限时处理(例如 API 请求超时)。
  • 后台任务管理(如 ASP.NET Core 中请求中止处理)。
  • 并行任务控制(取消一组相关任务)。

8. 完整示例

var cts = new CancellationTokenSource();
var token = cts.Token;

// 启动任务
var task = Task.Run(() =>
{
    try
    {
        while (true)
        {
            token.ThrowIfCancellationRequested();
            Console.WriteLine("工作...");
            Thread.Sleep(1000);
        }
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("任务取消。");
    }
});

// 例如:用户按下取消按钮,或者超时自动取消
Thread.Sleep(3000);
cts.Cancel();

9. 注意事项

  • 线程安全CancellationToken 是一个只读结构体,本身线程安全。
  • 资源释放CancellationTokenSource 实现了 IDisposable,长时间不使用时需释放。
  • 不可复用:一旦取消,Token 无法重新激活,需创建新的 CancellationTokenSource

到此这篇关于C# CancellationToken的使用小结的文章就介绍到这了,更多相关C# CancellationToken使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C#实现给图片添加日期信息的示例详解

    C#实现给图片添加日期信息的示例详解

    这篇文章主要为大家详细介绍了如何利用C#实现给图片添加日期信息,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C#实现ComboBox自动匹配字符

    C#实现ComboBox自动匹配字符

    本文介绍C#如何实现ComboBox自动匹配字符1.采用CustomSource当做提示集合2. 直接使用下拉列表中的项作为匹配的集合,需要了解的朋友可以参考下
    2012-12-12
  • C#后台调用前台JS函数方法

    C#后台调用前台JS函数方法

    今天小编就为大家分享一篇关于C#后台调用前台JS函数方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C#判断一个字符串是否包含另一个字符串的方法

    C#判断一个字符串是否包含另一个字符串的方法

    这篇文章主要介绍了C#判断一个字符串是否包含另一个字符串的方法,涉及C#中IndexOf方法的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-04-04
  • C#针对System.Drawing.Bitmap压缩的实现

    C#针对System.Drawing.Bitmap压缩的实现

    C#中System.Drawing.Bitmap压缩可通过调整尺寸和JPEG质量实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • C#单例模式Singleton的实现详解

    C#单例模式Singleton的实现详解

    单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一,它提供了一种创建对象的最佳方式,本文主要为大家介绍的是C#单例模式的实现方法,需要的可以参考一下
    2023-05-05
  • Unity实现简单虚拟摇杆

    Unity实现简单虚拟摇杆

    这篇文章主要为大家详细介绍了Unity实现简单虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 基于C#的UDP协议的同步通信实现代码

    基于C#的UDP协议的同步通信实现代码

    本篇文章主要介绍了基于C#的UDP协议的同步实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C#如何将List<string>转换为List<double>

    C#如何将List<string>转换为List<double>

    这篇文章主要介绍了C#如何将List<string>转换为List<double>问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C# WinForm程序设计简单计算器

    C# WinForm程序设计简单计算器

    这篇文章主要为大家详细介绍了C# WinForm程序设计简单计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论