创建线程的昂贵的操作,为每一个短暂的异步操作创建线程会产生显著的开销。所以需要使用Pooling技术。
线程池其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。 线程池非常适合大量小的运算。
通常是将计算密集型的操作放在worker线程池中运行,而线程池的大小会根据当前的CPU使用量自动调整,通过下面两个方法,我们可以设置线程池的大小:
ThreadPool.SetMaxThreads(10, 200);
ThreadPool.SetMinThreads(2, 40);
两个参数分别是WorkThread和IO thread的限制。
一个例子
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 许可协议。转载请注明出处!