线程池模式与C#中用法
一、线程池模式解析
1. 核心概念
线程池是一种 管理线程生命周期的技术,主要解决以下问题:
-
减少线程创建/销毁开销:复用已存在的线程
-
控制并发度:避免无限制创建线程导致资源耗尽
-
任务队列:有序处理异步请求
2. 工作流程
3. .NET 中的实现
-
内置线程池:
System.Threading.ThreadPool
-
关键方法:
ThreadPool.QueueUserWorkItem(state => { /* 任务逻辑 */ });
4. 线程池组成System.Threading.ThreadPool
组件 | 说明 |
---|---|
Worker Threads | 处理普通任务 |
I/O Completion Ports | 处理异步I/O操作 |
任务队列 | 存放等待执行的任务 |
二、基本使用方法
1. 提交任务
// 使用 QueueUserWorkItem
ThreadPool.QueueUserWorkItem(state =>
{Console.WriteLine($"Task executed on thread {Thread.CurrentThread.ManagedThreadId}");// 长时间运行的任务
});// 带参数的任务
ThreadPool.QueueUserWorkItem(obj =>
{var data = (string)obj;Console.WriteLine($"Processing: {data}");
}, "Hello ThreadPool");
2. 获取线程池状态
ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"可用工作线程: {workerThreads}, I/O线程: {completionPortThreads}");ThreadPool.GetMinThreads(out int minWorker, out int minIO);
ThreadPool.GetMaxThreads(out int maxWorker, out int maxIO);
三、高级配置
1. 设置线程数限制
// 设置最小线程数(预热)
ThreadPool.SetMinThreads(4, 4);// 设置最大线程数(默认值通常足够)
ThreadPool.SetMaxThreads(16, 16); // 不推荐随意修改
2. 使用 Task 封装(现代推荐方式)
Task.Run(() =>
{// 会自动使用ThreadPoolConsole.WriteLine("Running via Task");
});
3. 带返回值的任务
var result = await Task.Run(() =>
{Thread.Sleep(1000);return 42;
});
Console.WriteLine($"Result: {result}");
四、最佳实践
1. 适合场景
场景 | 示例 |
---|---|
短期任务 | <1秒完成的任务 |
I/O密集型 | 文件/网络操作 |
并行计算 | 简单的数据分块处理 |
2. 不适合场景
场景 | 问题 | 替代方案 |
---|---|---|
长时间运行 | 阻塞线程池线程 | new Thread() 或 LongRunning 任务 |
需要优先级 | 线程池无优先级 | 自定义优先级队列 |
精细控制 | 需要线程亲和性 | 专用线程 |
3. 性能调优建议
// 在应用启动时预热线程池
ThreadPool.SetMinThreads(Environment.ProcessorCount * 2, Environment.ProcessorCount * 2);// 监控线程池状态
PerformanceCounter poolCounter = new PerformanceCounter("ThreadPool", "Thread Count", Process.GetCurrentProcess().ProcessName);
五、与 DelegateSpooler 对比
特性 | ThreadPool | DelegateSpooler |
---|---|---|
线程管理 | 自动 | 手动控制 |
任务队列 | 全局共享 | 独立实例 |
优先级 | 不支持 | 可自定义 |
适用场景 | 通用短期任务 | 需要特殊控制的场景 |
六、完整示例
1. 批量处理任务
using System;
using System.Threading;class Program
{static void Main(){// 设置最小线程数ThreadPool.SetMinThreads(4, 4);// 提交10个任务for (int i = 0; i < 10; i++){int taskId = i;ThreadPool.QueueUserWorkItem(_ => {Console.WriteLine($"Task {taskId} started on thread {Thread.CurrentThread.ManagedThreadId}");Thread.Sleep(1000); // 模拟工作Console.WriteLine($"Task {taskId} completed");});}Console.ReadLine();}
}
2. 异步I/O操作
using System.Net;
using System.IO;ThreadPool.QueueUserWorkItem(_ =>
{var request = WebRequest.Create("https://example.com");using var response = request.GetResponse();using var reader = new StreamReader(response.GetResponseStream());Console.WriteLine(reader.ReadToEnd());
});
七、常见问题解决
1. 线程饥饿
现象:任务长时间排队不执行
解决:
// 增加最小线程数
ThreadPool.SetMinThreads(Environment.ProcessorCount * 2, Environment.ProcessorCount * 2);
2. 异常处理
ThreadPool.QueueUserWorkItem(_ =>
{try{// 可能抛出异常的代码}catch (Exception ex){Console.WriteLine($"Task failed: {ex}");}
});
3. 取消任务
var cts = new CancellationTokenSource();// 提交可取消任务
Task.Run(() =>
{while (!cts.IsCancellationRequested){// 工作代码}
}, cts.Token);// 取消所有任务
cts.Cancel();
总结
-
简单任务:优先使用
ThreadPool.QueueUserWorkItem
-
现代开发:推荐使用
Task.Run
(内部使用线程池) -
复杂场景:考虑自定义线程池(如
DelegateSpooler
) -
关键原则:避免阻塞线程池线程,保持任务短小精悍
通过合理使用线程池,可以显著提升应用程序的并发性能和资源利用率。
相关文章:
线程池模式与C#中用法
一、线程池模式解析 1. 核心概念 线程池是一种 管理线程生命周期的技术,主要解决以下问题: 减少线程创建/销毁开销:复用已存在的线程 控制并发度:避免无限制创建线程导致资源耗尽 任务队列:有序处理异步请求 2. …...
47、C#可否对内存进⾏直接的操作?
是的,C# 可以通过几种方式对内存进行直接操作,尽管它主要是一门托管语言,内存管理通常由.NET运行时自动处理。 主要方法 1.unsafe 代码和指针 使用 unsafe 关键字可以启用指针操作需要项目启用"允许不安全代码"选项示例…...
精益数据分析(70/126):MVP迭代中的数据驱动决策与功能取舍
精益数据分析(70/126):MVP迭代中的数据驱动决策与功能取舍 在创业过程中,最小可行化产品(MVP)的迭代优化是从验证假设到实现产品市场契合的关键环节。今天,我们结合《精益数据分析》中的方法论…...
大数据与数据库服务器参数调优方法
1 硬件配置优化 存储与磁盘 优先选择 SSD固态硬盘替代机械硬盘,显著降低I/O延迟,提升随机读写性能。 采用 RAID 10阵列实现高性能与冗余的平衡,适用于高并发数据库场景。 大数据场景中,通过多磁盘并行挂载(如HDFS)提升吞吐量,规避单盘性能瓶颈。 I/…...
【Fifty Project - D28】
今日完成记录 TimePlan完成情况9:30 - 11:30Leetcode√14:00 - 15:30练胸√15:30 - 16:30Leetcode√19:40 - 21:20有氧√ Leetcode 今天是周赛复盘篇,昨天的周赛太刺激…...
Image and depth from a conventional camera with a coded aperture论文阅读
Image and depth from a conventional camera with a coded aperture 1. 研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 创新方法:编码光圈设计与统计模型2.1 核心思路2.2 关键公式与模型架构2.2.1 图像形成模型2.2.2 深度可区分性准则2.2.3 统计模型与优化框架2.2…...
vue3 vite 项目中自动导入图片
vue3 vite 项目中自动导入图片 安装插件配置插件使用方法 安装插件 yarn add vite-plugin-vue-images -D 或者 npm install vite-plugin-vue-images -D配置插件 在 vite.config.js 文件中配置插件 // 引入 import ViteImages from vite-plugin-vue-images;plugins: [vue(),/…...
软考-软件工程开发模型
软考-软件工程开发模型 参考视频: 软件工程概述&开发模型 ,配合视频理解更清晰~ 软件的生命周期为:需求分析、软件设计、软件开发、运行维护直至被淘汰 几个阶段。 软件工程支持 4 个活动,简称 PDCA,…...
纸上流年:Linux基础IO的文件理解与操作
文章目录 前言:数字世界的窗口🌇序章🏙️正文一、文件理解二、C语言文件操作2.1、文件打开2.2、文件关闭2.3、文件写入2.4、文件读取 三、系统级文件操作3.1、打开 open3.1.1、函数理解 3.2、关闭 close3.3、写入 write3.4、读取 read 四、小…...
基础深度补全模型DepthLab: From Partial to Complete
许多任务本身就包含部分深度信息,例如:(1)三维高斯图像修复;(2)激光雷达深度补全;(3)利用 Dust3R 进行稀疏视角重建;以及(4࿰…...
15 秒写一首歌?AI 音乐生成模型 ACE-Step 上手体验!
在人工智能技术持续突破的浪潮中,音乐创作领域迎来了革命性的变革。近日,阶跃星辰与ACE Studio联合发布的开源音乐大模型ACE-Step(中文名:音跃)正式亮相,标志着AI音乐创作技术迈入全新阶段。这款集成了最新…...
如何在数据库中正确存储金额?
无论是开发电商平台、财务系统还是支付应用,金额的存储都是核心需求。但许多新手开发者常因字段类型选择不当,导致金额计算错误甚至资金损失。本文将用最通俗的语言,详细讲解如何专业地设计数据库中的金额字段。 一、为什么不能随便选字段类型…...
网络请求和状态管理
安装axios 创建项目,输入名称 新建文件夹: 在文件夹下输入cmd 运行 最后在复制到浏览器中 得到页面 使用axios axios封装成模块 实现一个学生信息案例 模拟数据,请求数据 安装完成后新建一个mock文件夹,制作一个模拟数据 配置…...
TIF导入TWF坐标方法
TIF坐标导入 1、打开Arcmap,将影像拖入界面,点击确定 2、点击工具箱→投影变换→定义投影 国家2000,WGS84坐标系 点击确定 显示已完成,即可 3、批处理 将需要定义的tif拖入到ARCMAP中,点击定义投影,右键…...
系统思考:动态性复杂
我们是否有遇到过这样的困境?做决策时,总觉得问题很简单,但总是看不清楚全貌。越做越复杂,最后好像什么都没解决,反而把事情弄得更糟。 其实,这就是动态性复杂的表现。它包含了两个关键因素:细节…...
智能体应用如何重塑未来生活?全面解析技术场景与实在Agent突破
智能体应用有哪些?在科技飞速发展的当下,人工智能正以前所未有的速度渗透到我们生活的方方面面。而智能体技术,作为人工智能领域的一颗璀璨新星,正逐渐展现出其重塑未来生活的巨大潜力。从办公效率的提升到医疗服务的优化…...
20.自动化测试框架开发之Excel配置文件的IO开发
20.自动化测试框架开发之Excel配置文件的IO开发 一、核心架构解析 1.1 类继承体系 class File: # 文件基类# 基础文件验证和路径管理class ExcelReader(File): # Excel读取器# 实现Excel数据解析逻辑1.2 版本依赖说明 # 必须安装1.2.0版本(支持xlsx格式&#…...
1.1 Epson机器人常用指令1-Print函数、RobotInfo$
本文介绍Print, RobotInfo的使用. 主要总结如下: 1. Print可以向串口、网口、手操器TP1,RC软件等发送数据 2. RobotInfo$(4)可以得到机器人序列号。用于防止程序下载到其他机器人上。 3. CX, CY, CZ可以返回点的XYZ坐标值。 Rea…...
【机器人】复现 3D-Mem 具身探索和推理 | 3D场景记忆 CVPR 2025
3D-Mem 是用于具体探索和推理的3D场景记忆,来自CVPR 2025. 使用信息丰富的多视角图像,来表示场景并捕捉已探索区域的丰富视觉信息, 整合了基于前沿的探索,使智能体能够通过考虑已知和潜在的新信息,做出明智的决策。 …...
视觉-语言导航:综述与类别
22年4月来自国防科大的论文“Vision-Language Navigation: A Survey and Taxonomy”。 视觉-语言导航 (VLN) 任务要求智体遵循人类语言指令,在未曾见过的环境中导航。这个充满挑战的领域涉及自然语言处理、计算机视觉、机器人技术等领域,并催生了众多专…...
基于SpringBoot的家政预约系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
什么是子网委派?
Azure 子网委派的概念 子网委托使您能够为所选的 Azure PaaS 服务指定一个特定的子网,并将其注入到您的虚拟网络中。子网委托为客户提供了完全的控制权,可以管理 Azure 服务与其虚拟网络的集成。 当您将子网委托给 Azure 服务时,您允许该服务为该子网建立一些基本的网络配…...
5个yyds的.Net商城开源项目
今天一起来盘点下5个商城开源项目。 1、支持多语言、多商店的商城,.Net7 EF7领域驱动设计架构(Smartstore) 项目简介 Smartstore 支持桌面和移动平台、多语言、多商店、多货币的商城,并支持SEO优化,支持无限数量的…...
如何快速隔离被攻击的服务器以防止横向渗透
网络延迟过高会显著影响用户体验和服务性能,以下是系统化的排查思路和解决方案: --- ### **1. 快速定位问题范围** #### **基础检查** - **测试延迟目标**: bash ping <目标IP或域名> # 检查基础延迟(ICMP…...
【解决】自己的域名任何端口都访问不到,公网地址正常访问,服务器报错500。
一、问题描述 后端项目部署在服务器上,通过域名访问接口服务器报错500,通过浏览器访问殒命的任何端口都是无法访问此网站。 但是通过公网地址访问是可以正常访问到的,感觉是域名出现了问题 二、解决过程 先说结论:问题原因是…...
Kubernetes MCP服务器(K8s MCP):如何使用?
#作者:曹付江 文章目录 1、什么是 Kubernetes MCP 服务器?1.1、K8s MCP 服务器 2、开始前的准备工作2.1. Kubernetes集群2.2. 安装并运行 kubectl2.3. Node.js 和 Bun2.4. (可选)Helm v3 3、如何设置 K8s MCP 服务器3.1. 克隆存储…...
RHCE 练习三:架设一台 NFS 服务器
一、题目要求 1、开放 /nfs/shared 目录,供所有用户查询资料 2、开放 /nfs/upload 目录,为 192.168.xxx.0/24 网段主机可以上传目录,并将所有用户及所属的组映射为 nfs-upload,其 UID 和 GID 均为 210 3.将 /home/tom 目录仅共享给 192.16…...
SpringBoot(二)--- SpringBoot基础(http协议、分层解耦)
目录 前言 一、SpringBoot入门 1.入门程序 2.解析 二、HTTP协议 1.HTTP概述 2.HTTP请求协议 2.1 GET方式的请求协议 2.2 POST方式的请求协议 2.3 两者的区别 2.4 获取请求数据 3.HTTP响应协议 三、分层解耦 1.三层架构 2.IOC&DI 2.1 入门 2.2 IOC详解 2.…...
mongodb部署Shard Cluster
一、创建集群认证文件 mkdir ./data ./confopenssl rand -base64 756 > ./conf/keyfilechmod 400 ./conf/keyfiledocker network create mongo-cluster二、部署configsever副本集 #!/bin/bash inamemongodb:8.0.9 conf_namemongo_conf_ replset_nameconfrsecho "…...
【大数据】MapReduce 编程--索引倒排--根据“内容 ➜ 出现在哪些文件里(某个单词出现在了哪些文件中,以及在每个文件中出现了多少次)
将 Hadoop 所需的 JAR 文件添加到项目中,确保可以使用 Hadoop 的 API JAR (Java Archive) 文件是一种用于打包多个 Java 类文件、资源文件(如图片、配置文件等)以及元数据的压缩文件格式。它类似于 ZIP 文件,但 JAR 文件通常用于 …...
使用PHP对接东南亚、日本、印度和印度尼西亚股票数据源
本文将介绍如何通过StockTV提供的API接口,使用PHP语言来获取并处理东南亚(包括马来西亚、新加坡等)、日本、印度以及印度尼西亚的股票市场数据。我们将以获取市场列表、查询公司信息、查看涨跌排行榜为例,展示具体的操作流程。 准…...
从基础到高级:网站反爬技术全景解析与第三方工具对比
网站反爬与用户行为检测实战指南:从基础防护到智能识别 在当今数据驱动的互联网时代,网站面临着日益复杂的爬虫攻击和恶意行为威胁。本文将系统性地介绍网站反爬与用户行为检测的技术体系,包括基本原理、防护策略、第三方组件选型以及真实案例分析,帮助开发者构建更加安全…...
docker安装Prometheus+Grafana
docker 安装Prometheus 下载镜像 很多镜像服务器都不行了,我用的这个地址还可以 查看可用docker镜像地址:https://cloud.tencent.com/developer/article/2485043 docker pull docker.xuanyuan.me/prom/prometheus:latest启动 docker run -itd --name…...
解决 Linux Bash 脚本因换行符问题导致的 “bash^M: No such file or directory“ 错误
一、问题重现 最近在部署一个 Bash 脚本时遇到一个诡异的问题: bash $ chmod x deploy.sh $ ./deploy.sh /usr/bin/env: ‘bash\r’: No such file or directory 明明脚本内容正确,权限也设置好了,为什么会出现这样的错误? 二…...
DS1302实时时钟模块
目录 0.单片机定时器时钟的几个缺点: 1.DS1302介绍 2.引脚定义和应用电路 3.原理图 4.内部结果框图,RAM(寄存器) 5.寄存器定义 6.时序定义 7.DS1302时钟代码 第一步: 第二步: 第三步:…...
redis的List为什么用ziplist和quicklist
redis的List为什么用ziplist和quicklist 压缩列表(ziplist) 是一种节省内存的数据结构,最早是 Redis 中为了减少内存开销而引入的一种顺序存储结构。它不是标准库里的内容,而是某些底层系统(比如 Redis)在…...
Java 后端基础 Maven
Maven 1.什么是Maven 2.Maven的作用 Maven核心 Maven概述 IDEA集成Maven 1.创建Maven项目 点击设置里的 Project Structure 将jdk和编译语言进行设置 随后点击apply点击ok 2.Maven坐标 3.导入Maven项目 将文件夹复制到当前项目的目录下 在这个目录下,在磁盘中…...
开源情报的发展前景与行业运用
开源情报系统在实际中的应用正随着技术进步和社会需求的增长而不断拓展,其在国家安全、军事、经济、公共卫生等多个领域展现出显著价值。以下是结合最新动态与案例的综合分析: 一、国家安全:从传统到现代的情报体系升级 开源情报在国家安全…...
《黑马前端ajax+node.js+webpack+git教程》(笔记)——node.js教程+webpack教程(nodejs教程)
黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajaxnode.jswebpackgit),一套全覆盖 文章目录 Node.js与Webpack-01.Node.js入门定义和作用什么是前端工程化?(离不开node.js)Node.…...
Canvas设计图片编辑器全讲解(一)Canvas基础(万字图文讲解)
一、前序 近两年AI发展太过迅速,各类AI产品层出不穷,AI绘图/AI工作流/AI视频等平台的蓬勃发展,促使图片/视频等复杂内容的创作更加简单,让更多普通人有了图片和视频创作的机会。另一方面用户内容消费也逐渐向图片和视频倾斜。在“…...
disryptor和rabbitmq
disryptor和rabbitmq Disruptor 是什么? Disruptor 是一个由 LMAX Exchange 开发的高性能、低延迟的进程内(in-process)并发编程框架/库。它最初是为了解决金融交易系统中高吞吐量、低延迟消息传递的需求而设计的。 核心特点和设计理念&am…...
java基础-关键字:static、单例模式
1.例如:我们创造一个人的类,我们希望他是中国人类,所以我们希望所有对象都共有中国人的属性; import org.w3c.dom.ls.LSOutput;import java.sql.Connection; import java.sql.SQLOutput; import java.util.Arrays;public class Ma…...
深入解析PyTorch中MultiheadAttention的参数key_padding_mask与attn_mask
1. 基本背景 在multiheadattention中存在两个mask,一个参数是key_padding_mask,另外一个是attn_mask,尽管这两个参数是被人们所熟知的填充掩码和注意力掩码,但是深度理解以便清晰区分对于深刻理解该架构非常重要。 2. 参数Key_p…...
【Hadoop】--HA高可用搭建--3.2.2
修改环境配置文件 hadoop-env.sh # 在文件末尾添加以下内容: # java_home记得修改 export JAVA_HOME/usr/java/jdk1.8.0xxxx export HDFS_NAMENODE_USERroot export HDFS_DATANODE_USERroot export HDFS_ZKFC_USERroot export HDFS_JOURNALNODE_USERroot export YA…...
OpenCv(7.0)——银行卡号识别
文章目录 前言1.1 模板处理模块读取模板图像并预处理轮廓检测与处理构建数字模板库 1.2 银行卡图像预处理图像尺寸标准化形态学操作二值化与闭操作 1.3 卡号区域定位轮廓筛选逻辑 1.4 数字识别与结果展示完整代码展示总结 前言 本代码实现基于传统图像处理技术,通过…...
新手怎么样制作网站?
如果你是没有任何的建站基础,又没有任何的网站管理经验,那么应该如何开展网站制作呢?今天由我给大家分享一下网站制作的步骤和流程: 一、制定网站的核心主题: 在用户开展网站制作的之前,先确定一下以下的内…...
React集成百度【JSAPI Three】教程(002):设置不同的环境效果
文章目录 2、设置不同的天气2.1 安装antd前端UI库2.2 是否开启动态天空2.3 创建天气组件2.4 代码2.0版本下载2、设置不同的天气 2.1 安装antd前端UI库 安装命令: npm install antd --save2.2 是否开启动态天空 天气中的阴天、多云需要在开启动态天空后才能有效显示。在页面…...
Helm Chart 中配置多个 Docker Registry 地址以实现备用访问
在 Helm Chart 中配置多个 Docker Registry 地址以实现备用访问,可以通过以下几种方式实现: 1. 在 values.yaml 中定义多个 Registry 在 values.yaml 中定义主 Registry 和备用 Registry,以便在部署时灵活切换: # values.yaml …...
星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态
星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态 2024年5月15日,成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控v1.0.0”物联网AI智控系统正式发布。本次发布会吸引了包括沃尔沃集团、新希…...
利用ffmpeg截图和生成gif
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpgffmpeg -i input.mp4 -ss 00:00:10 -vframes 180 output.jpg -vframes 180代表截取180帧, 实测后发现如果视频是60fps,那么会从第10秒截取到第13秒-i input.mp4:指定输入视频文件。-ss 00:00:10:…...