Thread.Start与ThreadPool.QueueUserWorkItem

问题描述

|| Microsoft .NET基础类库提供了几种创建线程并启动它的方法。基本上,调用与提供相同类型服务的其他调用非常相似:创建一个代表执行流(或更多执行流)的对象,为它分配一个代表要执行的执行流的委托,最后根据委托签名,一个对象作为参数。 好吧,有两种方法(基本上): 1)使用“ 0”类。
Thread curr = new Thread(myfunction); /* In a class,myfunction is a void taking an object */
curr.Start(new Object()); /* Or something else to be downcast */
2)使用“ 2”类。
ThreadPool.QueueUserWorkItem(myfunction,new Object()); /* Same philosophy here */
我应该使用1)或2)有什么特殊的原因吗? 性能原因? 模式? 最好的方法是什么? 我感觉答案是:“视情况而定”。您能否列出其中一种方法优于另一种方法的情况?     

解决方法

        启动新线程可能是非常昂贵的操作。线程池重复使用线程,因此分摊了成本。除非需要专用线程,否则建议使用线程池。通过使用专用线程,您可以更好地控制线程特定的属性,例如优先级,区域性等。另外,您不应在线程池上执行长时间运行的任务,因为它将迫使线程池生成其他线程。 除了您提到的选项之外,.NET 4还提供了一些出色的并发抽象。检查Task和Parallel类以及所有新的PLINQ方法。     ,        对于何时不使用线程池,托管线程池具有一些非常好的指导。 根据我的经验,您需要在需要持久,专用,长期运行的线程时创建自己的线程。对于其他所有内容,请使用异步委托或
QueueUserWorkItem
BackgroundWorker
之类的东西,或者使用.NET 4.0的与任务相关的功能。     ,        ThreadPool中的线程是后台线程。 由新的Thread对象创建和启动的所有线程都是前台线程。 后台线程不能使托管执行环境保持运行状态。 有关更多信息,请参考http://msdn.microsoft.com/en-us/library/h339syd0.aspx。     ,        在.NET 4.5.2中,他们添加了一个新方法:HostingEnvironment.QueueBackgroundWorkItem。 这似乎是
ThreadPool.QueueUserWorkItem
的替代方法。两者的行为类似,但是在ASP.NET中使用新方法有一些不错的好处:   HostingEnvironment.QueueBackgroundWorkItem方法使您可以   安排小的后台工作项目。 ASP.NET跟踪这些项目,并且   防止IIS突然终止工作进程,直到所有   后台工作项已完成。此方法无法调用   在ASP.NET托管的应用程序域之外。     ,        使用ThreadPool可以减少对线程系统的控制。这是为您简化过程的折衷方案。如果您拥有ThreadPool所需的全部功能,则可以随意使用它。如果您需要对线程的更多控制,那么您当然需要使用Thread类。     ,        ThreadPool.QueueUserWorkItem()基本上用于即发即弃的情况,即应用程序不依赖于操作是否完成。 使用经典线程进行细粒度控制。     ,        除以下情况外,您应使用
ThreadPool.QueueUserWorkItem
: 您需要一个前台线程。 您需要线程具有特定的优先级。 您有导致线程长时间阻塞的任务 时间。线程池具有最大线程数,因此很大 被阻止的线程池线程数可能会阻止任务执行 开始。 您需要将线程放入单线程单元中。所有 ThreadPool线程位于多线程单元中。 您需要具有与线程关联的稳定身份,或者 将线程专用于任务。 参考链接。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...