C#多线程之线程池ThreadPool用法
线程池ThreadPool是什么
在程序运行过程中,有时会出现需要进行并发处理的情况。与传统的线程操作(Thread
类)相比,线程池可以更好地管理线程资源,提高线程的复用率,避免了频繁创建和销毁线程的开销,从而提高了程序的性能和稳定性。
线程池通过预先创建一组线程并维护这些线程,让它们在没有工作时处于等待状态,一旦有工作需要处理,就将工作丢进线程池中,由池中的线程去执行。线程池还可以统计线程活动情况、限制可并发的线程数、管理线程的状态等等。.NET Framework提供了ThreadPool
类来实现线程池功能。
线程池ThreadPool基本用法
创建线程池
指定最大线程数和完成队列大小,在开始使用线程池之前必须先创建一个。
ThreadPool.SetMaxThreads(int workerThreads, int completionPortThreads);
提交任务
方式1:将工作对象WaitCallback
类型作为参数传递。
ThreadPool.QueueUserWorkItem(new WaitCallback(Process), data);
方式2:Lambda表达式传递。
ThreadPool.QueueUserWorkItem(state =>
{
// do something
}, null);
注意:如果需要将一个变量传递给任务,最好通过Lambda表达式把变量赋值给state
参数,避免在多线程的情况下出现竞争条件。
线程池常用方法
- 获取当前线程池中可用的工作线程数和已完成的异步 I/O 操作线程数:
ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"线程池中可用的工作线程数:{workerThreads}\n线程池中已完成的异步 I/O 操作线程数:{completionPortThreads}\n");
- 获取已请求的线程数和已完成的异步 I/O 操作数:
ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"线程池中请求的工作线程数:{workerThreads}\n线程池中已完成的异步 I/O 操作线程数:{completionPortThreads}\n");
- 获取等待执行的工作项数量:
int availableWorkerThreads, availableCompletionPortThreads;
ThreadPool.GetAvailableThreads(out availableWorkerThreads, out availableCompletionPortThreads);
Console.WriteLine($"线程池中等待处理的工作项数:{availableWorkerThreads}\n");
线程池ThreadPool使用示例
示例1:线程池调用简单方法
创建一个线程池,使用QueueUserWorkItem
方法异步调用方法WorkProcess
:
static void WorkProcess(object state)
{
Console.WriteLine($"线程池处理方法:{state}");
}
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(WorkProcess),"Welcome to ThreadPool");
Console.ReadLine();
}
输出结果为:
线程池处理方法:Welcome to ThreadPool
示例2:线程池处理复杂计算操作
使用QueueUserWorkItem
异步调用方法Calculate
,模拟一个大量耗时的计算操作,通过ManualResetEvent
控制等待线程池中的线程都处理完成之后再输出结果。
static void Calculate(object state)
{
Thread.Sleep(5000); // 模拟一个耗时计算操作
int n = (int)state;
Console.WriteLine($"线程池处理结果:{n * n}");
mre.Set(); // 所有线程都处理完成退出等待状态
}
static ManualResetEvent mre = new ManualResetEvent(false);
static void Main(string[] args)
{
int count = 10;
for (int i = 0; i < count; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Calculate), i);
}
mre.WaitOne(); // 等待所有线程都处理完再输出结果
Console.WriteLine("所有线程池中的线程都已处理完毕!");
Console.ReadLine();
}
输出结果为:
线程池处理结果:0
线程池处理结果:1
线程池处理结果:4
线程池处理结果:9
线程池处理结果:16
线程池处理结果:25
线程池处理结果:36
线程池处理结果:49
线程池处理结果:64
线程池处理结果:81
所有线程池中的线程都已处理完毕!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程之线程池ThreadPool用法 - Python技术站