我想知道所有情景和情况应该使用Thread
类,ThreadPool
类或Task Parallel Library
,它们之间有什么区别。
我试图通过谷歌搜索找到这个,但找不到任何东西。
我问这个问题,因为在某些情况下,使用Thread
类和自己管理线程会更好,其他场景ThreadPool
会更好但不太确定。
e.g。我们希望在应用程序启动时从数据库加载大量的Order数据:什么线程管理技术(Thread | ThreadPool | TPL)将提供最佳的好处,并且还提供更多的代码可维护性和其他好处。
上面只是一个示例,但我想具体了解在线程场景中要考虑的所有参数 可以帮助决定在{的使用之间{1}}或Thread
或ThreadPool
答案 0 :(得分:6)
一般情况下,我建议始终在面向.NET 4或更高版本的代码中使用Task
或Task<T>
。
这提供了一个统一的API,它为您提供了默认使用ThreadPool的好处(但允许您使用自定义调度程序或指定LongRunning
提示,默认情况下会创建一个专用线程)。此外,它将来会证明您的代码,随着C#5的推进,您将获得在适当时能够与新的异步语言支持集成的优势。
直接使用Thread
或ThreadPool
类的问题在于它们不包含组合多个工作项的方法,至少不能直接使用。 ThreadPool.QueueUserWorkItem
将利用线程池,但这也会(默认情况下)与Task.Factory.StartNew
一起发生。但是,生成的Task
允许轻松合成其他任务(Tasks.WaitAll
,延续等),从而允许更多表现形式的多个工作项组合。
TPL还提供了在框架中直接使用和支持cancellation model的好处。
答案 1 :(得分:2)
在大多数情况下,你应该使用Task
,正如里德在答案中解释的那样。
但是,在某些罕见的情况下,您希望控制正在创建的线程。这包括您想要设置的时间:
在这些情况下,您应该直接使用Thread
(当然不会修改线程池线程的优先级)。虽然您可以将其与TPL结合使用,例如创建一个TaskScheduler
,在Task
上运行Thread
,并将公寓状态设置为STA。