.NET线程池ThreadPool.QueueUserWorkItem

概述

ThreadPool.QueueUserWorkItem 是 .NET 中用于将工作项排队到线程池执行的方法,它通过重用现有线程来优化性能,避免频繁创建和销毁线程的开销。

方法定义

命名空间:System.Threading

程序集:System.Threading.ThreadPool.dll

核心功能:将指定方法异步执行,由线程池线程调度 。

重载形式

‌无参数‌

csharp 复制代码
public static bool QueueUserWorkItem(WaitCallback callback)

参数:callback(WaitCallback委托,表示要执行的方法)

返回:true(成功排队),若失败抛出NotSupportedException 。 ‌

‌带参数‌

csharp 复制代码
public static bool QueueUserWorkItem(WaitCallback callback, object state)

参数:state(传递给回调方法的数据对象)

csharp 复制代码
 
ThreadPool.QueueUserWorkItem(ThreadProc, "参数");
private void ThreadProc(object state) { Console.WriteLine(state); }
 

实例

csharp 复制代码
using System;
using System.Threading;

class ThreadPoolExample
{
    static void Main(string[] args)
    {
        // 使用无参重载
        ThreadPool.QueueUserWorkItem(DoWorkWithoutState);
        
        // 使用带状态对象的重载,传递一个字符串
        ThreadPool.QueueUserWorkItem(DoWorkWithState, "Hello from state object");
        
        // 主线程等待一段时间,确保线程池任务有机会执行
        Thread.Sleep(2000);
        Console.WriteLine("主线程结束。");
    }
    
    // 无状态参数的方法
    static void DoWorkWithoutState(object state)
    {
        Console.WriteLine($"无状态任务在线程 {Thread.CurrentThread.ManagedThreadId} 中执行。");
    }
    
    // 带状态参数的方法
    static void DoWorkWithState(object state)
    {
        string message = state as string;
        Console.WriteLine($"带状态任务在线程 {Thread.CurrentThread.ManagedThreadId} 中执行,状态信息:{message}");
    }
}

与 Thread 的性能区别

线程管理方式‌

‌Thread‌:每次调用 new Thread().Start() 都会创建一个新的操作系统线程。

‌ThreadPool‌:利用已创建的空闲线程执行任务,没有空闲线程时才排队等待,不会盲目持续创建新线程。

‌资源开销‌

‌Thread‌:在高请求量场景下,频繁创建新线程会导致 CPU 不堪重负。

‌ThreadPool‌:通过线程复用显著降低资源消耗,但过多的线程任务仍会占用较多资源。

‌适用场景‌

‌Thread‌:适合需要长时间运行或需要精细控制线程行为的任务。

‌ThreadPool‌:更适合执行时间较短、数量较多的后台任务。

‌性能优势‌

线程池通过为应用程序提供一个由系统管理的辅助线程池,使您可以更为有效地使用线程。当有等待操作完成时,线程池中的辅助线程就会执行对应的回调函数。

相关推荐
名字还没想好☜9 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
ltl9 小时前
Serverless 数据库弹性理论:Neon 与 Aurora Serverless v2
数据库
·薯条大王9 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
hez201012 小时前
.NET 11 Runtime Async 详解
c#·.net·.net core
ZJH__GO12 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆12 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光13 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林13 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
猿长大人13 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
marvelyu14 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库