概述
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:更适合执行时间较短、数量较多的后台任务。
性能优势
线程池通过为应用程序提供一个由系统管理的辅助线程池,使您可以更为有效地使用线程。当有等待操作完成时,线程池中的辅助线程就会执行对应的回调函数。