ThreadPool类(线程池)学习
- 该类所在命名空间:
System.Threading 该类是静态类- 请注意线程池中的工作线程都是后台线程。这意味着当所有的前台线程(包括主程序线程)完成后,所有的后台线程将停止工作。
花费最少的时间来完成创建很多异步操作,创建线程是非常昂贵的操作,所以为每个短暂的异步操作区创建线程会产生显著的开销。
为了解决该问题,有一个常用的方式叫做池( pooling),线程池可以成功地适应于任何需要大量短暂的开销大的资源的情形。我们事先分配一定的资源,将这些资源放入到资源池。每次需要新的资源,只需从池中获取一个,而不用创建一个新的。当该资源不再被使用,时,就将其返回到池中。
.NET 线程池是该概念的一种实现。通过 System.Threading.ThreadPool 类型可以使用线程池。线程池是受,NET 通用语言运行时( Common Language Runtime,简称 CLR)管理的。这意味着每个 CLR 都有一个线程池实例。ThreadPool 类型拥有一个 QueueUserWorkItem 静态方法。该静态方法接受一个委托,代表用户自定义的一个异步操作。在该方法被调用后,委,托会进入到内部队列中。如果池中没有任何线程,将创建一个新的工作线程( worker thread) 并将队列中第一个委托放入到该工作线程中。如果想线程池中放入新的操作,当之前的所有操作完成后,很可能只需重用一个线程来执行这些新的操作。然而,如果放置新的操作过快,线程池将创建更多的线程来执行这些操,作。创建太多的线程是有限制的,在这种情况下新的操作将在队列中等待直到线程池中的工作线程有能力来执行它们。
当停止向线程池中放置新操作时,线程池最终会删除一定时间后过期的不再使用的线程。这将释放所有那些不再需要的系统资源。我想再次强调线程池的用途是执行运行时间短的操作。使用线程池可以减少并行度耗费,及节省操作系统资源。
我们只使用较少的线程,但是以比平常更慢的速度来执行异步操作 , 使用一定数量的可用的工作线程批量处理这些操作。如果操作能快速地完成则比较适用线程池,但是执行长时间运行的计算密集型操作则会降低性能。
使用 ThreadPool 中的 QueueUserWorkItem() 方法,将委托添加到工作队列中,如果线程池中有可用线程,就会执行该委托,我们可以添加多个委托到工作队列
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(Callback);
}
private static void Callback(object? obj)
{
//code
}

浙公网安备 33010602011771号