3

我想知道在哪些场景和情况下应该使用一个Thread类、一个ThreadPool类或Task Parallel Library它们之间的区别。

我试图通过谷歌搜索找到这个,但找不到任何东西。

我之所以这样问,是因为在某些情况下,使用Thread类和自己管理线程会更好,而在其他情况下ThreadPool会更好,但不太确定。

例如,我们希望在应用程序启动时从数据库中加载大量订单数据:什么线程管理技术(Thread | ThreadPool | TPL)将提供最佳优势,并且还将提供更多的代码可维护性和其他优势。

以上只是一个示例,但我想具体了解在线程场景中要考虑的所有参数,这些参数可以帮助决定使用ThreadOR ThreadPoolORTPL

4

2 回答 2

6

一般来说,我建议始终在面向 .NET 4 或更高版本的代码中使用TaskTask<T>

这提供了一个统一的 API,它为您提供了默认使用 ThreadPool 的好处(但允许您使用自定义调度程序或指定LongRunning提示,默认情况下会创建一个专用线程)。此外,它还能为您的代码提供未来证明,随着 C# 5 的发展,您将获得能够在适当时与新的异步语言支持集成的优势。

直接使用ThreadThreadPool类的问题在于它们不包含组合多个工作项的方法,至少不直接包含。 ThreadPool.QueueUserWorkItem将利用线程池,但这也发生(默认情况下)与Task.Factory.StartNew. 然而,结果Task允许与其他任务(Tasks.WaitAll、延续等)轻松组合,这允许对多个工作项进行更具表现力的组合。

TPL 还提供了直接使用和支持框架中的取消模型的好处。

于 2013-08-20T18:28:42.903 回答
2

在大多数情况下,您应该使用Tasks,正如 Reed 在他的回答中解释的那样。

但是在极少数情况下,您希望控制正在创建的线程。这包括您想要设置的时间:

  • 线程优先级
  • 公寓状态(一些 COM 对象需要这个)
  • 处理器亲和性(这应该很少见)

在这些情况下,您应该Thread直接使用(当然不要修改线程池线程的优先级)。尽管您可以将其与 TPL 结合使用,例如创建一个在 aTaskScheduler上运行其Tasks 的 a Thread,并且公寓状态设置为 STA。

于 2013-08-20T21:41:07.573 回答