C# 多线程 线程池以及异步APM EAP

ops/2025/1/15 8:42:51/

线程池 是 clr 管理,每个clr 一个线程池实例
最初 是为了 管理线程创建销毁资源 预先在池子里有一些线程 然后 从里面拿取空闲的线程进行逻辑,用途是用来 执行时间短的一些操作 能够在有限的线程中进行复用 好节省资源,就是 时间换空间 以稍微长的执行时间换取所创建线程所需要的空间资源
另外线程池 ThreadPool拥有一个静态方法QueueUserWorkItem 接收一个委托 然后异步去处理

也就是 第一个 异步实现方式通过委托 也就是 APM 异步编程模式

保持线程中的操作都是短暂的是非常重要的。不要在线程池中放入长时间运行的操作,或者阻塞工作线程。这将导致所有工作线程变得繁忙,从而无法服务用户操作。这会导致性能问题和非常难以调试的错误
 请注意线程池中的工作线程都是后台线程。这意味着当所有的前台线程(包括主程序线程)完成后,所有的后台线程将停止工作。

1.如何在线程池中取消执行
CancellationTokenSource cancle 或者 CancellationToken.IsCancellationRequested属性
2.如何在线程池中正确执行等待
一般是通过 结合信号 ManualResetEvent 来阻塞
3.使用System.Threading. Timer对象来在线程池中创建周期性调用的异步
4.通过 BackgroundWorker 事件 进行订阅从而达到异步程序方式 也就是 EAP基于事件驱动的异步

class Program
{static void Main(string[] args){RunOperations(TimeSpan.FromSeconds(5));RunOperations(TimeSpan.FromSeconds(7));}static void RunOperations(TimeSpan workerOperationTimeout){using (var evt = new ManualResetEvent(false))using (var cts = new CancellationTokenSource()){Console.WriteLine("注册等待信号");var worker = ThreadPool.RegisterWaitForSingleObject(evt,(state, isTimedOut) => WorkerOperationWait(cts, isTimedOut), null, workerOperationTimeout, true);Console.WriteLine("开始操作");ThreadPool.QueueUserWorkItem(_ => WorkerOperation(cts.Token, evt));Thread.Sleep(workerOperationTimeout.Add(TimeSpan.FromSeconds(2)));worker.Unregister(evt);}}static void WorkerOperation(CancellationToken token, ManualResetEvent evt){for (int i = 0; i < 6; i++){if (token.IsCancellationRequested){Console.WriteLine("已经超时业务");return;}Thread.Sleep(TimeSpan.FromSeconds(1));}evt.Set();}static void WorkerOperationWait(CancellationTokenSource cts, bool isTimedOut){if (isTimedOut){cts.Cancel();Console.WriteLine("超时需要取消");}else{Console.WriteLine("操作执行");}}
}

在这里插入图片描述


http://www.ppmy.cn/ops/150244.html

相关文章

leetcode 面试经典 150 题:存在重复元素 II

链接存在重复元素 II题序号219题型数组解法1. 哈希表、2. 滑动窗口难度简单熟练度✅✅✅✅ 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c; 满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0…

Django自带admin管理系统使用

1、admin路径地址 localhost:8000/admin 2、使用命令行创建超级管理员 python manage.py createsuperuser 之后按照提示一步一步往下走就好了。 3、修改管理员密码 python manage.py changepassword admin admin是超级管理员的账号 4、后台管理系统注册模型&#xff0c;…

redis缓存篇知识点总结

1.缓存雪崩 当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃 发生缓存雪崩有两…

2025年,华为认证HCIA、HCIP、HCIE 该如何选择?

眼看都到 2025 年啦&#xff0c;华为认证还吃香不&#xff1f; 把这问题摆在每个网络工程师跟前&#xff0c;答案可没那么容易说清楚。 到底考不考它值当不值当&#xff0c;重点在于您自己的职业规划&#xff0c;还有对行业走向的领会。 2025 年华为认证仍然值得一考&#…

Kotlin 快速上手指南:从安装 IntelliJ IDEA 到编写第一个程序

文章目录 什么是kotlinIntelliJ IDEA安装 IntelliJ IDEA创建 Kotlin 项目运行 Kotlin 程序更改进入后默认打开上一次项目的设置打开 IntelliJ IDEA进入设置:重新启动 IntelliJ IDEA:快速学习Kotlin变量声明类型推断条件表达式定义函数单表达式函数when 表达式when 语句的基本…

1. npm 常用命令详解

npm 常用命令详解 npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于安装和管理 Node.js 应用中的依赖库。下面是 npm 的一些常用命令及其详细解释和示例代码。 镜像源 # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 …

进程同步之信号量机制

信号量机制 信号量机制是一种用于进程同步和互斥的基本工具&#xff0c;特别是在并发编程中&#xff0c;广泛用于控制对共享资源的访问&#xff0c;避免数据竞争和死锁等问题。信号量机制由荷兰计算机科学家Edsger Dijkstra在1965年提出&#xff0c;并在操作系统的进程同步中发…

基于微信小程序的社区门诊管理系统php+论文源码调试讲解

第4章 系统设计 4.1系统结构设计 系统设计是把本系统的各项功能需求进行细化&#xff0c;而转换为软件系统表示的一个设计过程&#xff0c;在对目标系统的研究分析之后&#xff0c;做出整个系统平台的总体规划&#xff0c;进而对用例中各个对象进一步地合理精细设计。为降低整…