Mas*_*low 15 .net multithreading
我在SO上阅读随机问题和答案,并遇到了这个问题:
问的是使用线程池或使用普通线程的X方法.
使用线程池和普通线程有什么区别?
Mit*_*eat 21
线程池通常适用于短期运行的任务.它有一个限制,它是一个应用程序范围的有限资源(每个CPU 25个),并且有很多内部类使用threadpoool,所以如果你执行很多长时间运行的任务,你将耗尽所有线程.
对于长时间运行的任务,最好使用手动创建的线程,其background属性设置为true.
注意:在.NET Framework 2.0版中,Thread.CurrentPrincipal属性值将传播到使用该QueueUserWorkItem方法排队的工作线程.在早期版本中,不传播主体信息.
何时不使用线程池线程
有几种情况适合创建和管理自己的线程而不是使用线程池线程:
你需要一个前台线程(!).
您需要一个线程具有特定的优先级.
您有任务导致线程长时间阻塞.线程池具有最大线程数,因此大量被阻塞的线程池线程可能会阻止任务启动.
您需要将线程放入单线程单元中.所有ThreadPool线程都在多线程单元中.
您需要具有与线程关联的稳定标识,或者将线程专用于任务.
一个很大的区别是线程池线程上的未处理异常终止进程 ; 除了以下三个例外:
A ThreadAbortException被抛出一个线程池线程,因为Abort被调用了.
一个AppDomainUnloadedException被扔在一个线程池线程,因为应用程序域正在卸载.
公共语言运行库或主机进程终止该线程.
一些很好的参考是:
更新:回应评论.您可以使用该GetAvailableThreads方法在任何给定时间确定线程池中的实际线程数.ThreadPool.GetMaxThreads是一个不同的数量.它是在请求排队之前池中允许的最大值,而不是当前池中的实际线程数.
| 归档时间: |
|
| 查看次数: |
9506 次 |
| 最近记录: |