在程序中,如果某个创建某种对象所需要的代价太高,同时这个对象又可以反复使用,那么我们往往就会准备一个容器,用来保存一批这样的对象。于是乎,我们想要用这种对象时,就不需要每次去创建一个,而直接从容器中取出一个现成的对象就可以了。由于节省了创建对象的开销,程序性能自然就上升了.,
ThreadPool class提供了一个线程池。
而线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。线程池允许在后台运行多个工作,而不需要为每个任务频繁地创建和销毁单独的线程,从而减少了开销。
线程池优点:提高了线程的利用率,非常适合工作任务非常小,而且又需要使用单独的线程来解决的问题。
什么时候用线程池?什么时候用手动创建线程?
1、能用线程池的就用线程池
2、我们想手动关闭线程的话那么必须手动创建了。 Abort() Join()
3、我们需要对线程池的线程的优先级做设置的情景下,只能使用手动创建线程。
4、如果执行的线程执行时间特别长。
------------------------------------------------------------------------------------------------------------------------------------
扩展:普通的Windows应用程序(如控制台或WinForm/WPF),会将其设置为“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000,也就是说,它最多可以管理1000个线程同时运行
线程池的任务处理顺序不确定的,线程池的线程都是后台线程 优先级是:Normal’
线程池的使用:
ThreadPool .QueueUserWorkItem(WaitCallback, Object)
将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
WaitCallback:它表示要执行的方法。 Object:包含方法所用数据的对象。
ThreadPool .QueueUserWorkItem(WaitCallback)
将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
WaitCallback:它表示要执行的方法。
如果此方法成功排队,则为true;如果无法将该工作项排队,则引发OutOfMemoryException。
异常 | 条件 |
ApplicationException | 遇到了内存不足的情况。 |
OutOfMemoryException | 无法将该工作项排队。 |
ArgumentNullException | callBack 为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。 |