什么参数有助于决定何时使用哪个:C#中的线程或ThreadPool或任务

时间:2013-08-20 18:27:30

标签: multithreading c#-4.0 .net-4.0 task-parallel-library threadpool

我想知道所有情景和情况应该使用Thread类,ThreadPool类或Task Parallel Library,它们之间有什么区别。

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

我问这个问题,因为在某些情况下,使用Thread类和自己管理线程会更好,其他场景ThreadPool会更好但不太确定。

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

上面只是一个示例,但我想具体了解在线程场景中要考虑的所有参数 可以帮助决定在{的使用之间{1}}或ThreadThreadPool

2 个答案:

答案 0 :(得分:6)

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

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

直接使用ThreadThreadPool类的问题在于它们不包含组合多个工作项的方法,至少不能直接使用。 ThreadPool.QueueUserWorkItem将利用线程池,但这也会(默认情况下)与Task.Factory.StartNew一起发生。但是,生成的Task允许轻松合成其他任务(Tasks.WaitAll,延续等),从而允许更多表现形式的多个工作项组合。

TPL还提供了在框架中直接使用和支持cancellation model的好处。

答案 1 :(得分:2)

在大多数情况下,你应该使用Task,正如里德在答案中解释的那样。

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

  • 线程优先级
  • 公寓状态(某些COM对象需要这个)
  • 处理器亲和力(这应该非常罕见)

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