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

server/2025/1/17 14:52: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/server/159114.html

相关文章

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址。 它是分配给连接到互联网的设备&#xff08;如计算机、服务器、智能手机…

FPGA 串口与HC05蓝牙模块通信

介绍 关于接线&#xff1a;HC-05蓝牙模块一共有6个引脚&#xff0c;但经过我查阅资料以及自己的实操&#xff0c;实际上只需要用到中间的4个引脚即可&#xff08;即RXD,TXD,GND,VCC&#xff09;。需要注意的是&#xff0c;蓝牙模块的RXD引脚需要接单片机的TXD引脚&#xff0c;同…

科研总结系列|2-GPT学术写作提示词集锦手册

科研总结系列&#xff5c;2-GPT学术写作提示词集锦手册 一、前言 随着生成式人工智能&#xff08;如 ChatGPT&#xff09;的迅速发展&#xff0c;学术写作正变得更加智能和高效。高质量的学术论文不仅能够准确传达研究成果&#xff0c;也会在学术圈内带来更广泛的影响力。借助…

Linux安装Docker教程(详解)

如果想要系统学习docker,建议进入官方文档中学习&#xff1a;docker官方文档 一. 基本概念 Docker Desktop 和 Docker Engine 有什么区别&#xff1f; Docker Desktop for Linux 提供用户友好的图形界面&#xff0c;可简化容器和服务的管理。它包括 Docker Engine&#xff0c…

Electron 开发者的 Tauri 2.0 实战指南:文件系统操作

作为 Electron 开发者&#xff0c;我们习惯了使用 Node.js 的 fs 模块来处理文件操作。在 Tauri 2.0 中&#xff0c;文件系统操作被重新设计&#xff0c;采用了 Rust 的安全特性和权限系统。本文将帮助你理解和重构这部分功能。 文件操作对比 Electron 的文件操作 在 Electr…

Self-RAG

Self-RAG&#xff08;Self-Referencing Augmented Generation&#xff09; 是一种结合了 自我增强生成 和 检索增强生成&#xff08;RAG&#xff09;的技术方法。其主要目的是在自然语言生成&#xff08;NLG&#xff09;任务中&#xff0c;利用模型自身生成的信息来增强回答质量…

基于Netty+InfluxDB+MQTT+Spring Boot的物联网(IoT)项目实现方案

基于NettyInfluxDBMQTTSpring Boot的物联网&#xff08;IoT&#xff09;项目实现方案 引言 物联网&#xff08;IoT&#xff09;技术近年来发展迅速&#xff0c;广泛应用于智能城市、工业物联网、农业物联网等领域。本文将详细介绍如何使用Netty、InfluxDB、MQTT和Spring Boot…

LLM(大语言模型)支撑下的传统工作流转型发展为AI工作流

传统工作流 工作流入门这篇就够了 BPMN.JS中文教程 BPMN 工作流引擎解析 AI工作流是指一系列将人工智能技术应用于业务流程的有序步骤&#xff0c;目的是高效地完成特定任务或实现目标。以下是对AI工作流的详细解释&#xff1a; AI工作流 RAGAI工作流Agent&#xff1a;LLM框…