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

C#如何正确的停止一个多线程Task?CancellationTokenSource 的用法。

在 C# 中停止一个 Task 需要谨慎处理,因为直接强制终止(如 Thread.Abort())会导致资源泄漏或状态不一致。推荐使用 ​​协作式取消(Cooperative Cancellation)​​ 通过 CancellationToken 实现安全停止。以下是详细方法:


​1. 使用 CancellationToken 取消 Task​

​(1) 创建 CancellationTokenSource​
 

csharp

var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
​(2) 在 Task 中检查取消请求​
 

csharp

Task longRunningTask = Task.Run(() =>
{while (true){// 检查是否被取消if (token.IsCancellationRequested){Console.WriteLine("Task 已取消");token.ThrowIfCancellationRequested(); // 抛出 OperationCanceledException}// 模拟工作Console.WriteLine("Working...");Thread.Sleep(1000);}
}, token);
​(3) 触发取消​
 

csharp

// 请求取消
cts.Cancel();// 可选:等待Task处理取消(避免资源泄漏)
try
{await longRunningTask;
}
catch (OperationCanceledException)
{Console.WriteLine("Task 已安全终止");
}

​2. 处理取消时的清理工作​

如果 Task 需要在取消时释放资源(如关闭文件、数据库连接),通过 finally 块或 Register 方法实现:

 

csharp

Task.Run(() =>
{using (var resource = new SomeDisposableResource()){try{while (!token.IsCancellationRequested){// 工作代码}}finally{Console.WriteLine("释放资源");}}
}, token);

或通过 CancellationToken.Register

 

csharp

token.Register(() =>
{Console.WriteLine("取消时执行清理");
});

​3. 超时自动取消​

 

csharp

// 设置 5秒超时
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
Task.Run(() => { /* ... */ }, cts.Token);

​4. 为什么不推荐强制终止 Task?​

  • Thread.Abort() / Task.Dispose()

    • ❌ 抛出 ThreadAbortException,可能导致锁未释放、文件未关闭等问题。
    • ❌ .NET Core 及以上版本已移除 Thread.Abort()
  • ​协作式取消的优势​

    • ✅ 安全:Task 有机会清理资源。
    • ✅ 可控:可通过异常捕获取消逻辑。

​5. 完整示例​

 

csharp

using System;
using System.Threading;
using System.Threading.Tasks;class Program
{static async Task Main(){var cts = new CancellationTokenSource();var token = cts.Token;Task task = Task.Run(() =>{try{while (true){token.ThrowIfCancellationRequested();Console.WriteLine("Working...");Thread.Sleep(1000);}}catch (OperationCanceledException){Console.WriteLine("任务已取消");}}, token);// 3秒后取消Thread.Sleep(3000);cts.Cancel();await task; // 等待任务处理取消}
}

​总结​

  • ​推荐方式​​:始终通过 CancellationToken 实现协作式取消。
  • ​强制终止​​:仅在极端情况下考虑,并确保资源释放。
  • ​超时控制​​:结合 CancellationTokenSource(TimeSpan) 实现自动取消。

这种方法适用于 Taskasync/awaitParallel.ForEach 等场景,是 .NET 中处理任务取消的标准模式。

http://www.xdnf.cn/news/2480.html

相关文章:

  • 泰迪杯实战案例超深度解析:运输车辆安全驾驶行为分析与安全评价系统设计
  • 基于边缘人工智能的AI无人机-更高效更安全的飞行任务执行
  • macos下mysql 5.7/8.0版本切换
  • 如何修复Chrome浏览器的“无法连接到互联网”错误
  • 14、服务端组件:未来魔法预览——React 19 RSC实践
  • 《代码整洁之道》第10章 类 - 笔记
  • 谢飞机的Java面试之旅:从Spring Boot到Kubernetes的挑战
  • 用Python做有趣的AI项目 3:黑白图像自动上色(AI 上色器)
  • 数智读书笔记系列031《HIS内核设计之道——医院信息系统规划设计系统思维》书籍简介与读书笔记
  • 【读写视频】MATLAB详细代码
  • 【Go语言】ORM(对象关系映射)库
  • flutter 选择图片 用九宫格显示图片,右上角X删除选择图片,点击查看图片放大缩小,在多张图片可以左右滑动查看图片
  • QT中的文件操作
  • 在CentOS 8上在线安装Docker
  • ubuntu扩展逻辑卷并调整文件系统大小步骤
  • 1到12月和1到31日英文表达
  • Lua 第10部分 模式匹配
  • 在AWS Glue中实现缓慢变化维度(SCD)的三种类型
  • 阿里云直接对系统云盘扩容
  • OceanBase数据库-学习笔记1-概论
  • 为什么从Word复制到PPT的格式总是乱掉?
  • 使用Aspose.Words将Word转换为HTML时,字体样式丢失问题及解决方法
  • OpenCV彩色图像分割
  • 操作系统:计算机世界的基石与演进
  • 展销编辑器操作难度及优势分析​
  • kafka 中消费者 groupId 是什么
  • Word处理控件Spire.Doc系列教程:C# 通过模板创建 Word 文档
  • 【Java】IntelliJ IDEA 社区版安装
  • MAVLink协议:原理、应用与实践
  • 4.26 数据交互升级引入配置文件