编辑
2025-09-24
C#
00

目录

摘要
正文

摘要

创建线程的昂贵的操作,为每一个短暂的异步操作创建线程会产生显著的开销。所以需要使用Pooling技术。

线程池其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。 线程池非常适合大量小的运算。

正文

  • 保持线程中的操作都是非常短暂的。不要再线程池中放入长时间运行的操作,或者阻塞工作线程。
  • 请注意线程池中的工作线程都是后台线程。这意味着当所有的前台线程(包括主程序线程)完成后,所有的后台线程将停止工作。

通常是将计算密集型的操作放在worker线程池中运行,而线程池的大小会根据当前的CPU使用量自动调整,通过下面两个方法,我们可以设置线程池的大小:

ThreadPool.SetMaxThreads(10, 200);

ThreadPool.SetMinThreads(2, 40);

两个参数分别是WorkThread和IO thread的限制。

一个例子

image.png

C#
static double Total = 0; private void btnCal_Click(object sender, EventArgs e) { ThreadPool.SetMaxThreads(5, 5); for (int i = 0; i < 60; i++) { ThreadPool.QueueUserWorkItem(Cal, 5000); } MessageBox.Show(Total.ToString()); } private void Cal(object money) { Total += double.Parse(money.ToString()); }

如果不采用线程池,要开60线程异步执行Run()方法,空间资源之浪费,可见一斑。而现在我们最多用了5个线程,效率、性能都很好。

再修改一下,防止卡住

C#
private void btnCal_Click(object sender, EventArgs e) { Thread thread = new Thread(() => { ThreadPool.SetMaxThreads(5, 5); for (int i = 0; i < 6000000; i++) { ThreadPool.QueueUserWorkItem(Cal, 5000); } MessageBox.Show(Total.ToString()); }); thread.Start(); }

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!