ThreadPool
1.什么是线程池
线程池是对Thread的一种封装,方便管理,是一种享元模式。
2.线程池的好处:
- 避免API乱用,降低复杂度
- 减少创建销毁的成本,限制最大线程数量
3.利用ThreadPool开启异步线程:
ThreadPool.QueueUserWorkItem(t => this.DoSomethingLong("btnThreadPool_Click"));
4.ThreadPool线程等待
利用ManualResetEvent信號量的WaitOne方法。當ManualResetEvent設置為false時,WaitOne等待;直到ManualResetEvent執行Set方法將ManualResetEvent設置為true,WaitOne通過;Reset方法將ManualResetEvent設置為false,WaitOne繼續等待。
ManualResetEvent mre = new ManualResetEvent(false);//信號量
ThreadPool.QueueUserWorkItem(o =>
{
Thread.Sleep(5000);
this.DoSomethingLong("btnThreads_Click");
Console.WriteLine(o.ToString());
mre.Set();
}, "backbone");
Console.WriteLine("before WaitOne");
mre.WaitOne();
Console.WriteLine("after WaitOne");
没有需求。就别等待 阻塞线程。
5.线程池设置:
ThreadPool.SetMaxThreads(8, 8);//设置线程池的最大辅助线程数目,以及IO线程数目
ThreadPool.SetMinThreads(8, 8); //设置线程池的最小辅助线程数目,以及IO线程数目
6.使用ThreadPool封装回调
ThreadPool.QueueUserWorkItem(
o =>
{
Console.WriteLine("1234356786954");
new Action(() =>
{
Thread.Sleep(5000);
this.DoSomethingLong("btnThreads_Click");
//回调 包一层,放在这里
}).Invoke();
});