使用线程池和普通线程有什么区别?

Mas*_*low 15 .net multithreading

我在SO上阅读随机问题和答案,并遇到了这个问题:

C#,IAsyncResult和线程池

问的是使用线程池或使用普通线程的X方法.

使用线程池和普通线程有什么区别?

Mit*_*eat 21

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

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

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

何时不使用线程池线程

有几种情况适合创建和管理自己的线程而不是使用线程池线程:

  • 你需要一个前台线程(!).

  • 您需要一个线程具有特定的优先级.

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

  • 您需要将线程放入单线程单元中.所有ThreadPool线程都在多线程单元中.

  • 您需要具有与线程关联的稳定标识,或者将线程专用于任务.

一个很大的区别是线程池线程上的未处理异常终止进程 ; 除了以下三个例外:

  • A ThreadAbortException被抛出一个线程池线程,因为Abort被调用了.

  • 一个AppDomainUnloadedException被扔在一个线程池线程,因为应用程序域正在卸载.

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

一些很好的参考是:

托管线程池

在C#中线程化

在.NET Framework中编写线程池

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


Jos*_*rke 7

差异不在线程本身之间,因为它们的行为相同,不同之处在于谁管理线程的生命周期,以及如何使用它们.

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

这很好,但是这样做的缺点是线程池中可用的线程数量有限,所以如果排队一个长时间运行的任务,这可能会对你的应用程序产生负面影响,因为你可能正在使用一个线程池线程否则可能想要使用.

请参阅有关线程池的文章