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

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 中处理任务取消的标准模式。

相关文章:

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

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

【Redis】Redis Zset实现原理:跳表+哈希表的精妙设计

一、实现: Zset有序集合是一种由 跳表(Skip List)哈希表(Hash Table) 实现的数据结构。 二、特点功能: Set特性排序 三、跳表与哈希表分析: Zset的实现由两个数据结构: 1.跳表(Skip List):用于存储数据的排序和快…...

【前端】jQuery 对数据进行正序排列

你可以使用 jQuery 对数据进行正序排列&#xff08;按 jbsj 升序&#xff09;。以下是完整的代码示例&#xff1a; <!DOCTYPE html> <html> <head><title>按时间排序</title><script src"https://code.jquery.com/jquery-3.6.0.min.js&…...

Matlab 报错:尝试将 SCRIPT vl_sift 作为函数执行:

问题描述&#xff1a; 运行matlab程序出现报错&#xff1a; 警告: 名称不存在或不是目录: xxx\vlfeat-0.9.21\toolbox\mex\mexw64 xxxx 尝试将 SCRIPT vl_sift 作为函数执行: xxxx\vlfeat-0.9.21\toolbox\sift\vl_sift.m原因分析&#xff1a; 缺少 \vlfeat-0.9.21\toolbox…...

前端权限管理

前端权限 本质上就是控制前端视图层的展示和前端所发送的请求 一、RBAC 用户&#xff08;User&#xff09;&#xff1a;系统的使用者 角色&#xff08;Role&#xff09;&#xff1a;权限的集合&#xff08;如管理员、普通用户&#xff09;。 权限&#xff08;Permission&am…...

【PVR】《Adaptive Palm Vein Recognition Method》

[1]程良彬.自适应的手掌静脉识别方法研究[D].桂林电子科技大学,2023.DOI:10.27049/d.cnki.ggldc.2023.000681. 文章目录 1、Background and Motivation2、Related Work3、Advantages / Contributions4、Method4.1、Datasets and Metrics4.2、基于最大化手掌内切圆的感兴趣区域提…...

MLLM之Bench:LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略

MLLM之Bench&#xff1a;LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略 目录 LEGO-Puzzles的简介 1、LEGO-Puzzles的特点 LEGO-Puzzles的安装和使用方法 1、安装 步骤 0&#xff1a;安装 VLMEvalKit 步骤 1&#xff1a;设置 API 密钥&#xff08;可选&#xf…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据信息查看操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili DataFrame的基础信息和统计性信息。在我们拿到一 个数据集&#xff0c;用Pandas载入后&#xff0c;需要做一些初步的…...

【大模型微调与应用开发实战指南】从理论到工业级部署

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;LoRA微调&#xff09;运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、…...

动手学深度学习11.10. Adam算法-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址:11.10. Adam算法 — 动手学深度学习 2.0.0 documentation 本节开源代码…...

Spring Boot API版本控制实践指南

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 在API迭代过程中&#xff0c;版本控制是保障系统兼容性的重要机制。合理的版本控制策略可以帮助开发团队平滑过渡接口变更&#xff0c;同时支持多版本客…...

如何让自己的博客可以在百度、谷歌、360上搜索到(让自己写的CSDN博客可以有更多的人看到)

发现自己写的博客文章名复制&#xff0c;然后粘贴到百度进行搜索&#xff0c;发现搜索不到自己的&#xff0c;但是会显示其他人的CSDN博客。于是查找相关资料&#xff0c;整理出以下搜索引擎资源收录入口&#xff0c;把自己的文章链接输入进去&#xff0c;然后经过审核通过后&a…...

Transformer

一、为什么需要Transformer&#xff1f;先看传统模型的痛点​​ 1. ​​传统模型&#xff1a;RNN与CNN的短板​​ ​​RNN&#xff08;循环神经网络&#xff09;​​&#xff1a;逐个处理单词&#xff0c;像流水线作业。 ​​问题​​&#xff1a;速度慢&#xff08;无法并行&…...

LeetCode热题100--438.找到字符串中所有字母异位词--中等

1. 题目 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s “cbaebabacd”, p “abc” 输出: [0,6] 解释: 起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。 起始…...

仿微信上传头像,实现拍摄、相册选择、手动缩放、裁剪、蒙版、撤回、还原、上传微信本地文件功能

目前功能基于wx-cropper进行开发&#xff0c;wx-cropper 是一个基于微信小程序的图片裁剪工具 项目地址&#xff1a;gitcode地址 一、触发入口标签 <t-cell hover arrow class"userCell" catchtap"handleChangeHeadImg"><view slot"title&…...

Python 操作 Excel 插入图表:解锁数据可视化的高效密码

Python 操作 Excel 插入图表&#xff1a;解锁数据可视化的高效密码 在数据分析与展示的领域中&#xff0c;Python 凭借其强大的库支持&#xff0c;成为众多开发者与数据工作者的得力助手。将图表嵌入 Excel 文件&#xff0c;不仅能丰富数据呈现形式&#xff0c;还能让信息传递…...

python实战项目66:抓取考研招生专业信息

python实战项目66:抓取考研招生专业信息 一、流程分析二、完整代码一、流程分析 考研招生专业信息所在网页主页如下图: 在搜索框中输入所需查询的专业 点击“开设院校”,如下图所示: 打开浏览器开发者工具抓包,刷新页面,找到xhr数据包。 首先,在zydws.do数据包中抓…...

Awesome-Embodied-AI: 具身机器人的资源库

&#x1f4a1; 你是否在寻找具身人工智能&#xff08;Embodied AI&#xff09;领域的研究资源&#xff1f;是否希望有一个系统性的资源集合来加速你的研究&#xff1f;今天给大家推荐一个重磅项目&#xff01; &#x1f31f; 为什么需要这个项目&#xff1f; 具身人工智能是一…...

Java位运算符大全

1. Java 支持的位运算符 Java 提供了 7 种位运算符&#xff1a; 运算符名称描述示例&按位与&#xff08;AND&#xff09;两个位都为 1 时&#xff0c;结果才为 15 & 3 → 1|按位或&#xff08;OR&#xff09;两个位有一个为 1 时&#xff0c;结果就为 15 | 3 → 7^按…...

Using the NCCL Library: A Practical Guide

文章目录 Using the NCCL Library: A Practical GuidePrerequisitesBasic NCCL ConceptsPractical Demo CodeCompilation and ExecutionKey Steps ExplainedCommon Patterns1. Point-to-Point Communication2. Broadcast3. Using Streams Best Practices Using the NCCL Librar…...

UML 活动图详解之小轿车启动活动图分析

目录 一、UML 活动图概述 二、UML 活动图的构成元素详解 &#xff08;一&#xff09;活动 &#xff08;二&#xff09;动作状态 &#xff08;三&#xff09;活动状态 &#xff08;四&#xff09;迁移&#xff08;转换&#xff09; &#xff08;五&#xff09;初始节点 …...

58常用控件_QTextEdit的使用

目录 代码示例: 获取多行输入框的内容 代码示例&#xff1a;验证输入框的各种信号 QTextEdit 表示多行输入框也是一个富文本 & markdown 编辑器 并且能在内容超出编辑框范围时自动提供滚动条 QTextEdit不仅能表示纯文本&#xff0c;还可以表示html和markdown QPlainTextE…...

uniapp-商城-42-shop 后台管理 分包

在uniapp 的全局文件中&#xff0c;讲了分包 pages.json 页面路由 | uni-app官网 主要是用于小程序的打包。超高两M就不能上传的。 看看官网上是怎么说的。 1 subPackages 分包加载配置&#xff0c;此配置为小程序的分包加载机制。 因小程序有体积和资源加载限制&#xf…...

Zookeeper断开连接时分布式锁释放问题的解决方案

Zookeeper断开连接时分布式锁释放问题的解决方案 当Zookeeper客户端与服务器断开连接时&#xff0c;可能会导致分布式锁无法正常释放&#xff0c;这是分布式锁实现中需要重点解决的问题。以下是几种解决方案&#xff1a; 1. 利用Zookeeper临时节点的特性 核心原理&#xff1…...

Nginx配置文件介绍

Nginx 的配置文件是模块化的&#xff0c;不同的配置文件承担着不同的功能&#xff0c;下面为你详细介绍常见的配置文件及其作用&#xff1a; 这些文件在/etc/nginx/目录下&#xff1a; 1、主配置文件 /etc/nginx/nginx.conf 是 Nginx 的核心配置文件&#xff0c;对全局参数进…...

新闻数据接口开发指南:从多源聚合到NLP摘要生成

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;新闻行业也迎来了新的变革。AI不仅能够自动化生成新闻内容&#xff0c;还能通过智能推荐系统为用户提供个性化的新闻体验。万维易源提供的“新闻查询”API接口&#xff0c;结合了最新的AI技术&#xff0c;为开…...

【八股消消乐】发送请求有遇到服务不可用吗?如何解决?

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、机器学习、深度学习、力扣算法等相关知识点&#xff0c;期待与你…...

【博通芯片方案】调试指令详解版一(无线)

前言 无线路由器的主流芯片方案包括,博通(BCM)、联发科(MTK)和高通等等。掌握常用的调试指令,有助于产品的测试以及故障排查。本系列文章将介绍博通芯片方案调试指令,欢迎有需要的朋友关注和分享。 无线 wl指令 查无线国家码 指令:wl -i wl1 country 说明:本系列文章…...

【Google Colab】利用unsloth针对医疗数据集进行大语言模型的快速微调(含跑通原代码)

【本文概述】 为了快速跑通&#xff0c;首先忽略算力等问题&#xff0c;使用google colab云端服务器&#xff0c;选择unsloth/DeepSeek-R1-Distill-Llama-8B大语言模型进行微调&#xff0c;微调参数只进行了简单的设置。 在微调的时候&#xff0c;实际说明colab对8B的模型微调…...

基于STM32、HAL库的ADS1255IDBR模数转换器ADC驱动程序设计

一、简介: ADS1255IDBR是德州仪器(TI)生产的一款高精度、低噪声、24位ΔΣ模数转换器(ADC),主要特性包括: 24位无丢失码分辨率 高达23位有效分辨率(ENOB) 数据速率可达30kSPS 低噪声: 2.5μV RMS (20SPS时) 可编程增益放大器(PGA): 1-64V/V 单/差分输入配置 内置自校准和系…...

T检验、F检验及样本容量计算学习总结

目录 〇、碎语一、假设检验1.1 两种错误1.2 z检验和t检验1.3 t检验1.3.1 单样本t检验1.3.2 配对样本t检验1.3.3 独立样本t检验1.4 方差齐性检验1.4 卡方检验二、样本容量的计算2.1 AB测试主要的两种应用场景2.2 绝对量的计算公式2.3 率的计算公式参考资料〇、碎语 听到最多的检…...

PDFMathTranslate:让数学公式在PDF翻译中不再痛苦

在日常的论文阅读、教材翻译中&#xff0c;我们经常会遇到一个极其恼人的问题&#xff1a;PDF里的数学公式翻译错乱。即使用上了各种强大的PDF翻译工具&#xff0c;公式依然可能被拆碎、误解&#xff0c;甚至丢失。针对这个痛点&#xff0c;PDFMathTranslate 应运而生。 本文将…...

Docker(二):docker常用命令

一、帮助命令 1、docker 帮助命令 命令说明docker version / docker -v查看docker的版本信息docker info查看docker详细信息docker --help / docker -h查看docker帮助命令&#xff0c;可以查看到相关的其他命令 二、Docker镜像命令 1、docker pull 从远程仓库docker hub 上拉…...

Missashe考研日记-day28

Missashe考研日记-day28 1 专业课408 学习时间&#xff1a;2h学习内容&#xff1a; 今天先是预习了OS关于虚拟内存管理的内容&#xff0c;然后听了一部分视频课&#xff0c;明天接着学。知识点回顾&#xff1a; 1.传统存储管理方式特征&#xff1a;一次性、驻留性。2.局部性原…...

基于esp32实现键值对存储读写c程序例程

在基于 ESP32 的系统中&#xff0c;我们可以使用 NVS&#xff08;Non-Volatile Storage&#xff0c;非易失性存储&#xff09;来实现系统配置参数的掉电存储和读写。NVS 是 ESP32 提供的一种存储机制&#xff0c;允许我们将键值对数据存储在闪存中&#xff0c;即使设备掉电&…...

半导体行业如何开展风险管理?有没有半导体风控案例参考?

近年来&#xff0c;供应链中断事件的频发&#xff0c;成了越来越多半导体人的噩梦&#xff1a; ❗ 地缘冲突引爆“氖气危机”&#xff0c;生产成本激增&#xff01; ❗ 关税政策反复&#xff0c;被迫调整全球供应链布局&#xff01; ❗ 自然灾害导致工厂停工&#xff0c;原材…...

使用 malloc 函数模拟开辟一个 3x5 的整型二维数组

在 C 语言中&#xff0c;二维数组是非常常见的数据结构&#xff0c;用于表示矩阵或者表格形式的数据。而在动态内存分配的情况下&#xff0c;我们通常使用 malloc 函数来为数组分配内存。这篇博客将介绍如何通过 malloc 动态分配一个 3x5 的整型二维数组&#xff0c;并且使用下…...

Github 热点项目 rowboat 一句话生成多AI智能体!5分钟搭建企业级智能工作流系统

今日高星项目推荐&#xff1a;rowboat凭借1705总星数成为智能协作工具黑马&#xff01;亮点速递&#xff1a;①自然语言秒变AI流水线——只需告诉它“帮外卖公司处理配送异常”&#xff0c;立刻生成多角色协作方案&#xff1b;②企业工具库即插即用&#xff0c;Python包HTTP接口…...

Redis05-进阶-主从

零、文章目录 Redis05-进阶-主从 1、搭建主从架构 &#xff08;1&#xff09;概述 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 &#xff08;2&#xff09;集群概况 我们搭建的主从…...

rockermq多线程消费者配置

rockermq多线程消费者配置 增加消费者数量实现消费者consumer多线程消费 或是 task分布式部署&#xff0c;原理一样 都是增加 consumer数量&#xff0c;程序在多线程 处理的地方已经添加过 分布式redisson锁 保证数据在多线程下的唯一性。 配置 task.yml 配置文件 &#xff08…...

Spring框架的ObjectProvider用法-笔记

在Spring框架中&#xff0c;ObjectProvider 是一个用于灵活获取Bean实例的接口&#xff0c;它允许开发者以编程方式有条件地或可选地获取Bean&#xff0c;而无需强制依赖注入&#xff0c;避免在Bean不存在时启动失败。 1. ObjectProvider 的核心功能 ObjectProvider 是Spring…...

DigitalOcean推出Valkey托管缓存服务

今天我们激动地宣布推出DigitalOcean的Valkey托管缓存服务&#xff0c;这是我们全新的托管数据库服务&#xff0c;能够无缝替换托管缓存&#xff08;此前称为托管Redis&#xff09;。Valkey托管缓存服务在你一直依赖的功能基础上&#xff0c;还提供了增强工具来支持你的开发需求…...

如何通过挖掘需求、SEO优化及流量变现成功出海?探索互联网产品的盈利之道

挖掘需求&#xff0c;优化流量&#xff0c;实现变现&#xff1a;互联网出海产品的成功之路 在当今全球化的数字时代&#xff0c;越来越多的企业和个人选择将业务扩展到国际市场。这一趋势不仅为企业带来了新的增长机会&#xff0c;也为个人提供了通过互联网产品实现盈利的途径…...

ASP.NET图片盗链防护指南

图片盗链(Hotlinking)是指其他网站直接链接到你服务器上的图片资源,这会消耗你的带宽和服务器资源。以下是几种在ASP.NET中防止图片盗链的有效方法: 1. 使用URL重写模块(推荐) 在Web.config中配置URL重写规则: xml <system.webServer> <rewrite> …...

2025-4-25 情绪周期视角复盘(mini)

直接说结论&#xff0c;没有前戏哈&#xff0c;国芳集团这波消费的行情就相当于当时机器人大周期里的DS的一个补涨周期&#xff0c;那么红宝丽就是接替了中毅达的衣钵的趋势穿越龙&#xff0c;趋势穿越龙没有结束&#xff0c;仅仅是主升暂停&#xff0c;高位震荡&#xff0c;后…...

Java求职者面试:从Spring Boot到微服务的技术深度探索

场景&#xff1a;互联网大厂Java求职者面试 角色介绍&#xff1a; 面试官&#xff1a;技术精湛&#xff0c;负责把控面试质量。谢飞机&#xff1a;搞笑的程序员&#xff0c;偶尔能答对问题。 第一轮&#xff1a;基础知识 面试官&#xff1a;谢飞机&#xff0c;你能简要介绍…...

wsl(8) -- 图形界面

1. 前言 记录一些关于wsl2图形界面的事情。 2. x11-apps wsl2默认已支持图形界面&#xff0c;只是我们选择安装的wsl2 ubuntu发行版是非桌面的&#xff0c;其中没有集成桌面应用&#xff0c;Linux的桌面和windows不同&#xff0c;windows的桌面系统是内核的一部分&#xff0…...

socket套接字-UDP(中)

socket套接字-UDP&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147465441?fromshareblogdetail&sharetypeblogdetail&sharerId147465441&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link UDP服务器…...

Android源码编译命令详解

一、引言 先看下面几条指令,相信编译过Android源码的人都再熟悉不过的。 source setenv.sh lunch make -j8记得最初刚接触Android时,同事告诉我用上面的指令就可以编译Android源码,指令虽短但过几天就记不全或者忘记顺序,每次编译时还需要看看自己的云笔记,冰冷的指令总…...

AI 发展历史与关键里程碑_附AI 模型清单及典型应用场景以及物流自动化适合的模型选择

AI 发展历史与关键里程碑_附AI 模型清单及典型应用场景以及物流自动化适合的模型选择 下面分三部分进行介绍: 1. AI 发展历史与关键里程碑 1950 年:图灵测试 1950 年,艾伦图灵提出“图灵测试”(Turing Test),首次以可检验的方式讨论机器能否“思考”。# 图灵测试示意:…...