【问题标题】:what is the difference between using ThreadPool.QueueUserWorkItem and using System.Thread? [duplicate]使用 ThreadPool.QueueUserWorkItem 和使用 System.Thread 有什么区别? [复制]
【发布时间】:2011-09-15 20:13:35
【问题描述】:

可能重复:
Advantage of using Thread.Start vs QueueUserWorkItem

如果我想通过一个线程执行一个方法,所以我通常使用 System.Thread 这样的

 Thread th = new Thread(Test_Progress);
 th.Start();

但我的同事告诉我,像下面这样使用 ThreadPool.QueueUserWorkItem 更好

ThreadPool.QueueUserWorkItem(new WaitCallback(Test_Progress),(object)true );

那么性能和处理方式有什么不同吗??

【问题讨论】:

标签: c# .net multithreading


【解决方案1】:

线程是创建成本高昂的对象,使用线程池是在单独线程上执行快速工作的更好方法,而无需处理创建新线程的全部成本。

此外,您要确保不会在池线程上执行很长时间的执行操作,因为您可能会耗尽池中有限数量的线程。

您应该阅读 MSDN 文档,了解位于此处的线程池:http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

它将解释在尝试决定使用什么时要记住的一些事项。

【讨论】:

  • 谢谢Ryan,其实我是用它来保存一系列图像的,所以我想这是一个很长的操作,不是吗?
【解决方案2】:

ThreadPool 是线程池(集合),使用它将从该池中选择一个线程并在该线程内执行您的方法,因为 Thread 对象创建了新线程。 这是围绕对象池的一般概念,即当在您的应用程序中您需要使用多个对象时,一种选择是创建这些对象的池并从该池中选择对象,使用它然后将其放回池中,这是在那些对象创建成本高昂的情况,这也导致更好的可伸缩性。在线程的情况下,如果您的应用程序创建了许多线程,那么由于上下文切换,它会非常缓慢地爬行,因此最好使用线程池。另一个相同概念的例子是 SQL 连接池。

【讨论】:

  • 好的,终止线程怎么样?应用程序对它们的处理方式相同吗?
  • 不,在线程池中,您不会终止线程,只要您传递的委托返回,线程就会返回到线程池。管理线程和相关操作是线程池的职责
  • @Sara 你不应该终止一个线程,如果“终止”你的意思是“Thread.Abort()”。如果您的意思是“当胎面结束工作时会发生什么”,那么 Ankur 的反应是完美的。
  • (清楚我的意思是螺纹而不是螺纹 :-))
【解决方案3】:

如果您有很多短期运行的任务,请使用线程池。如果您只有少量且长时间运行的任务,则最好使用线程。

线程的使用使您可以更好地控制您的任务,相比之下,使用线程池可以使事情变得更容易。

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2013-10-31
    • 2013-07-19
    相关资源
    最近更新 更多