C#ThreadPool学习
一.简介
提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器
注意:线程池中启动的线程都是后台线程
二.主要方法
GetAvailableThreads(Int32, Int32) |
线程池中空闲线程数,检索由 GetMaxThreads(Int32, Int32) 方法返回的最大线程池线程数和当前活动线程数之间的差值。 |
GetMaxThreads(Int32, Int32) |
检索可以同时处于活动状态的线程池请求的数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。 |
GetMinThreads(Int32, Int32) |
发出新的请求时,在切换到管理线程创建和销毁的算法之前检索线程池按需创建的线程的最小数量。 |
QueueUserWorkItem(WaitCallback) |
将方法排入队列以便执行。 此方法在有线程池线程变得可用时执行。 |
QueueUserWorkItem(WaitCallback, Object) |
将方法排入队列以便执行,并指定包含该方法所用数据的对象。 此方法在有线程池线程变得可用时执行。 |
SetMaxThreads(Int32, Int32) |
设置可以同时处于活动状态的线程池的请求数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。 |
SetMinThreads(Int32, Int32) |
发出新的请求时,在切换到管理线程创建和销毁的算法之前设置线程池按需创建的线程的最小数量。 |
三.使用
1.QueueUserWorkItem
(1)回调不带参数
1 2 3 4 5 6 7 8 9 10 | private static void fun2() { for ( int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem( new WaitCallback(t => { Console.WriteLine($ "Thread ThreadId:{Thread.CurrentThread.ManagedThreadId}" ); })); } } |
运行结果:
(2)回调带参数
1 2 3 4 5 6 7 8 9 10 | private static void fun1() { for ( int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem( new WaitCallback(t => { Console.WriteLine($ "Thread {t} ThreadId:{Thread.CurrentThread.ManagedThreadId}" ); }), i); } } |
运行结果:
四.workerThreads和completionPortThreads
CLR线程池分为工作者线程(workerThreads)与I/O线程(completionPortThreads)两种:
(1)workerThreads:工作者线程是主要用作管理CLR内部对象的运作,通常用于计算密集的任务。
(2)completionPortThreads:I/O(Input/Output)线程主要用于与外部系统交互信息,如输入输出。
参考:
https://www.cnblogs.com/kissdodog/archive/2013/03/28/2986026.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本