【C# 多线程】如何停止正在运行中的子线程
如何停止正在运行中的子线程
- 通过协作式取消模式
- 强制终止线程(可能存在资源不能及时释放的泄漏风险)
通过协作式取消模式
在线程函数中,你可以周期性地检查一个标志位,以确定是否应该停止线程。该标记位可以是共享变量,也可以是CancellationToken。
CancellationTokenSource 和 CancellationToken 被用来发送取消请求,而任务或线程通过检查 CancellationToken.IsCancellationRequested 属性或调用 ThrowIfCancellationRequested 方法来响应这个请求。
using System;
using System.Threading;
using System.Threading.Tasks; //
// 方式1:使用CancellationToken,停止标志位来停止线程
//
class CancellationTokenExample
{ private CancellationTokenSource _cts = new CancellationTokenSource(); public void StartWork() { Task.Run(() => { try { // 模拟长时间运行的工作,直到有取消请求时,退出while while(!_cts.IsCancellationRequested) { Thread.Sleep(1000); //如果有取消请求,也可以通过抛出异常结束线程_cts.Token.ThrowIfCancellationRequested();} } catch (OperationCanceledException) { //线程被取消 } }, _cts.Token); } // 调用此函数来停止线程public void StopWork() { _cts.Cancel(); }
}//
// 方式2:使用共享变量,停止标志位来停止线程
//
class ThreadStopExample
{ // 停止标志 public volatile bool StopRequested { get; set; } public void StartWork() { Task.Run(() => { while (!StopRequested) { Thread.Sleep(1000); // 模拟工作 } }); } // 调用此函数来停止线程public void StopWork() { StopRequested = true; }
}
强制终止线程(可能存在资源不能及时释放的泄漏风险)
如果在线程中使用了一个内层的无限循环(while (true)),这将导致线程永远不会退出这个内层循环,此时要退出线程,除非执行强制停止。
using System;
using System.Threading;
using System.Threading.Tasks; class ForceExitCaseExample
{private CancellationTokenSource _cts;private Task task;public void StartWork(){//确保线程没有重复运行if (task == null || (task.IsCompleted || task.IsCanceled)){_cts = new CancellationTokenSource();task = Task.Run(() =>{//注册cancel时,执行Abort方法(不太行,偶尔报异常)//_cts.Token.Register(Thread.CurrentThread.Abort);//注册cancel时,执行Interrupt方法_cts.Token.Register(Thread.CurrentThread.Interrupt);try{bool workDone = false;//模拟长时间运行的工作Thread.Sleep(1000);Console.WriteLine("第一阶段工作完成...");//模拟条件长时间不满足,运行工作死循环while (!workDone){Console.WriteLine("第二阶段工作中...");Thread.Sleep(999);if (false){workDone = true;}}}catch (Exception ex){//线程被取消 Console.WriteLine($"线程异常结束:{ex.Message}");}}, _cts.Token);}}// 调用此函数来停止线程public void StopWork(){_cts.Cancel();}
}
相关文章:
【C# 多线程】如何停止正在运行中的子线程
如何停止正在运行中的子线程 通过协作式取消模式强制终止线程(可能存在资源不能及时释放的泄漏风险) 通过协作式取消模式 在线程函数中,你可以周期性地检查一个标志位,以确定是否应该停止线程。该标记位可以是共享变量࿰…...
服务器机房安全守护:五大物理安全实践
服务器机房是数字企业的心脏。无论是企业家还是经验丰富的IT专业人员,都知道服务器机房的安全性至关重要。如果没有采用适当的物理安全措施,其服务器很容易受到盗窃、人为破坏和自然灾害的破坏。 在保护服务器机房的领域内,需要采用多方面的…...
spring boot 修复 Spring Framework URL解析不当漏洞(CVE-2024-22243)
漏洞描述 当应用程序使用UriComponentsBuilder来解析外部提供的URL(如通过查询参数)并对解析的URL的主机执行验证检查时可能容易受到Open重定向攻击和SSRF攻击,导致网络钓鱼和内部网络探测等。 受影响产品或系统 6.1.0 < Spring Framew…...
VR全景HDR拍摄教程
什么是HDR? HDR可以用在哪里? 书面解释:HDR(高动态范围 High Dynamic Range)摄影,是摄影领域广泛使用的一种技术。 是不是有点懵? 我们来看一个实际的拍摄现场环境,你就懂了 我们…...
hive执行select count(1)返回0
背景: 做数据质量检核任务的时候,有些数据表有数据,直接查hive执行select count(1) from table返回的值一直是0 问题原因: hive通过select count(1)或者select count(*) 查询的是元数据库里面的rownum,如果数据表数据是通过load、…...
3D Gaussian splatting 协方差矩阵 球谐函数 简单理解
3D Gaussian splatting 是一种图形和视觉处理技术,常用于体积渲染、点云渲染和其他应用中,以便对数据进行平滑或重建。在这个上下文中,高斯分布(或高斯“splat”)用于表示单个数据点(如一个点云中的点&…...
代码随想录算法刷题训练营day27:LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串
代码随想录算法刷题训练营day27:LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串 LeetCode(39)组合总和 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;clas…...
docker 容器修改端口和目录映射
一、容器修改端口映射 一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [container-name] -p 8088:80 [image-name]…...
echarts鼠标事件
鼠标事件支持方法 ECharts 支持常规的鼠标事件类型,包括 ‘click’、 ‘dblclick’、 ‘mousedown’、 ‘mousemove’、 ‘mouseup’、 ‘mouseover’、 ‘mouseout’、 ‘globalout’、 ‘contextmenu’ 事件 简单实例 // 基于准备好的dom,初始化EChar…...
【北京迅为】《iTOP-3588开发板网络环境配置手册》第2章 电脑、开发板直连交换机或路由器
RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…...
6.5 共享数据
本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法:首先说明如何使用内容提供器封装内部数据的外部访问接口,然后阐述如何使用内容解析器通过外部接口操作内部数据,最后叙述如何利用内容解析器读写联系人信息,以…...
SpringBoot之Session新增、删除、获取配置与使用
SpringBoot之Session新增、删除、获取配置与使用 文章目录 SpringBoot之Session新增、删除、获取配置与使用1. SpringBoot版本2. 定义增删查Session的类3. 定义Session的监听器4. 使用 自定义根据sessionId进行session的新增、删除、获取操作 1. SpringBoot版本 <parent>…...
Hive UDF 札记
低版本的udf就不说了,太老了,说现在主流的。 1:initialize 方法的进一步理解: 在Apache Hive中,用户自定义函数(UDF)的initialize方法是一个可选的方法,它属于Hive UDF的生命周期…...
npm已经配置淘宝源仍然无法使用
使用npm命令安装Taro框架的时候,尽管已经设置淘宝源但是仍然无法下载,提示错误 >npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/cnpm failed, reason: certificate h…...
Qt5转Qt6笔记
背景 现在的主程序和扩展的dll库都是qt5环境下编译发布的。但是想以后用qt6。所以考虑是否能够在qt5中兼容qt6的动态链接库进行加载。于是...就开始吧 开始 2024-02-23 安装好qt6后,在vs2019中需要新增qt6版本的安装路径。目录在:扩展->QT VS Tools…...
FPGA高端项目:FPGA基于GS2971的SDI视频接收转HDMI输出,提供3套工程源码和技术支持
目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI图像缩放应用本方案的SDI纯verilog图像缩放视频拼接应用本方案的SDI HLS图像缩放视频拼接应用本方案的SDI视频编码动态字符叠加输出应用本方案的SDI视频编码多路视频融合视频叠加应用本方案的SDI视频…...
java 锁
在Java中,有多种类型的锁,用于处理多线程编程中的同步和并发问题。以下是Java中常见的锁类型:互斥同步锁(悲观锁) :Synchronized : Java中最基本的同步机制,它提供了一种简单且透明的方式来同步代码块或方法。Synchronized是基于进入和退出监视器对象(monitor)来实现方…...
该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改。
报错原因 在异步的时候,调用了其他异步,导致UI工程线程该变了数据源,所以只需要将线程变为原始的UI线程。 解决方案 await QueuedTask.Run(() > { Application.Current.Dispatcher.Invoke(() >{报错的代码,…...
Mybatis学习笔记:延迟加载
本文是自己的学习笔记,主要参考以下资料 - 马士兵教育 1、延迟加载2、开启延迟加载2.1、配置信息2.2、查询语法2.2.1、前置条件2.2.2、xml语法2.2.3、总结 1、延迟加载 延迟加载是用于优化一对多或者多对多的查询。 比如员工表和部门表,员工表left jo…...
蓝桥杯题练习:平地起高楼
题目要求 function convertToTree(regions, rootId "0") {// TODO: 在这里写入具体的实现逻辑// 将平铺的结构转化为树状结构,并将 rootId 下的所有子节点数组返回// 如果不存在 rootId 下的子节点,则返回一个空数组}module.exports convert…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
