当前位置: 首页 > news >正文

C# CancellationTokenSource CancellationToken Task.Run传入token 取消令牌

  • 基本使用方法
    • 创建 `CancellationTokenSource`
    • 获取 `CancellationToken`
    • 将 `CancellationToken` 传递给任务
      • ***注意***
    • 在任务中检查取消状态
    • 请求取消
    • 处理取消异常
  • 高级用法
    • 设置超时自动取消
    • 或者使用 `CancelAfter` 方法
    • 关联多个取消令牌
    • 注册回调
  • 注意事项

CancellationTokenSourceC# 中用于实现异步操作取消的核心类,它生成 CancellationToken 对象,该对象可以传递给异步方法,并在异步方法内部检查是否收到取消请求。

基本使用方法

创建 CancellationTokenSource

CancellationTokenSource cts = new CancellationTokenSource();

获取 CancellationToken

CancellationToken token = cts.Token;

CancellationToken 传递给任务

Task task = Task.Run(() => DoWork(token), token);

注意

// 传递给
Task.Run(() => {
	Foo();
}, token);
// 的token只是在Task开始运行前检查一次是否取消,如果取消,Run不了一点

在任务中检查取消状态

static void DoWork(CancellationToken token)
{
    for (int i = 0; i < 10; i++)
    {
    	// 检查是否收到取消请求
         if (token.IsCancellationRequested)
        	token.ThrowIfCancellationRequested();// 此处抛出异常,外面用try catch捕获
        	
        Console.WriteLine($"Task working... {i}");
        Thread.Sleep(500); // 模拟耗时操作
    }
}

请求取消

cts.Cancel();

处理取消异常

try
{
    await task;
}
catch (OperationCanceledException)
{
    Console.WriteLine("Task was cancelled.");
}

高级用法

设置超时自动取消

CancellationTokenSource cts = new CancellationTokenSource(5000); // 5秒后自动取消
CancellationToken token = cts.Token;

或者使用 CancelAfter 方法

CancellationTokenSource cts = new CancellationTokenSource();
cts.CancelAfter(5000); // 5秒后自动取消

关联多个取消令牌

CancellationTokenSource tokenSource1 = new CancellationTokenSource();
CancellationTokenSource tokenSource2 = new CancellationTokenSource();

CancellationTokenSource linkedTokenSource =
	CancellationTokenSource.CreateLinkedTokenSource(
		tokenSource1.Token, 
		tokenSource2.Token
	);
	
linkedTokenSource.Token.Register(() => 
	Console.WriteLine("Linked token cancelled")
);

tokenSource1.Cancel(); // 会触发 linkedTokenSource 的取消

注册回调

token.Register(() => Console.WriteLine("Cancellation requested"));

注意事项

  • 取消操作是协作式的,任务必须主动检查 CancellationToken 的状态。
  • CancellationTokenSourceCancel 方法会触发所有注册的回调。
  • 默认情况下,CancellationTokenSource 是一次性的,取消后无法重置。

通过这些方法,CancellationTokenSource 可以有效地管理异步操作的取消。

相关文章:

  • Celery 全面指南:Python 分布式任务队列详解
  • [MRCTF2020]套娃
  • 查看MYdql服务器状态/s
  • mysql--用户管理
  • Retrofit网络编程Glide获取图片
  • 搭建gpu版本的tensorflow
  • 单片机内存划分总览与介绍
  • 【老张的程序人生】一天时间,我成软考高级系统分析师
  • ctfhow——web入门171~175
  • Python每日一题(7)
  • Go语言手动内存对齐的四大场景与实践指南
  • Android面试总结之Handler 机制深入探讨原理、应用与优化
  • Wi-SUN技术,强势赋能智慧城市构筑海量IoT网络节点
  • 数据可视化(matplotlib)-------图表样式美化
  • LabVIEW 布尔控件回车键触发程序退出
  • 力扣HOT100之普通数组:238. 除自身以外数组的乘积
  • Pydantic Schema生成指南:自定义JSON Schema
  • Nginx RTMP 网络调用模块 (ngx_rtmp_netcall_module) 详细分析
  • Spring Boot 集成实战:AI 工具如何自动生成完整微服务模块
  • 解决 Gin Web 应用中 Air 热部署无效的问题
  • 知名的seo快速排名多少钱/宁波seo排名公司
  • 扁平化设计风格的网站模板免费下载/优化seo网站
  • 视频 怎么做网站/电商培训内容有哪些
  • 电子商务及网站建设/短视频营销优势
  • 东莞一站式网站推广运营/百度推广客服投诉电话
  • 手机网站推荐哪些/厦门关键词排名提升