2009-06-29 156 views

回答

19

线程池通常适用于短期运行任务。它有一个局限性,它是一个应用程序范围内的有限资源(每个CPU 25个),并且有很多使用threadpoool的内部类,所以如果执行很多长时间运行的任务,则会耗尽所有线程。

对于长时间运行的任务,最好使用手动创建的线程,并将其背景属性设置为true。

注意:在.NET Framework 2.0版中,Thread.CurrentPrincipal属性值传播到使用QueueUserWorkItem方法排队的工作线程。在早期版本中,主要信息不会被传播。

何时不使用线程池中的线程

有几种方案中,它是适当的创建和使用线程池中的线程管理自己的线程,而不是:

  • 您需要前景线程(!)。

  • 您需要一个线程才能拥有特定的优先级。

  • 您有导致线程长时间阻塞的任务。线程池拥有最大数量的线程,因此大量阻塞的线程池线程可能会阻止任务启动。

  • 您需要将线程放置到单线程单元中。所有ThreadPool线程都在多线程的公寓中。

  • 你需要有与线程关联稳定的身份,或以奉献一个线程的任务。

一个大区别是,在线程池中的线程未处理的异常终止该进程;这三种情况例外:

  • 一个ThreadAbortException抛出一个线程池中的线程,因为Abort被调用。

  • AppDomainUnloadedException在线程池线程中抛出,因为应用程序域正在被卸载。

  • 公共语言运行库或主机进程终止线程。

一些很好的参考是:

The Managed Thread Pool

Threading in C#

Programming the Thread Pool in the .NET Framework

更新:响应意见。您可以使用GetAvailableThreads方法来确定线程池中任何给定时间的实际线程数。 ThreadPool.GetMaxThreads是不同的数量。它是请求排队前在池中允许的最大值,而不是当前在池中的实际线程数。

+0

据池默认情况下,维持每处理器250的工作线程的文档。 – 2009-06-29 14:16:19

0

线程池创建线程和assigsn工作到一个空闲线程。这种方式为每个工作项目创建和处理线程都是预防措施,因为创建和处理线程是相对昂贵的操作。

3

线程池拥有许多可供您使用线程,这可以消除创建新线程,也就是当你创建一个正常的线程会发生什么成本的。

7

区别不在线程本身之间,因为它们会表现相同,区别在于谁管理线程的生命周期以及如何使用它们。

.net中的线程池是一个线程池,它会增长或缩小,当你为要处理的线程池排队某个线程时,它将确定是否需要启动一个新线程或将重用一个现有线程。您不必显式创建线程。

这很好,但是它的缺点是线程池中可用的线程数量有限,所以如果排队等待长时间运行的任务,这可能会对应用程序产生负面影响,因为您可能会用尽线程池线程,其他的东西可能想要使用。

看到这个article关于线程池