Task和Thread有什么区别?

时间:2011-04-11 18:21:38

标签: c# multithreading .net-4.0

今天我正在挖掘TPL并找到一个新的Task.Now我只是想知道task和Thread之间的差异是什么,哪个更好?

5 个答案:

答案 0 :(得分:59)

  

任务和线程之间的差异是什么?

假设您正在经营一家图书传递公司。你有四辆车和四个司机。汽车是一个线程,一个驱动程序是一个处理器,一个书籍交付是一项任务。您面临的问题是如何有效地安排驾驶员和汽车,以便尽快完成任务。

当事情变得奇怪的是,当车辆(线程)多于驱动程序(处理器)时。然后发生的事情是驾驶员停放一辆车(暂停线程)并进入另一辆车(开关上下文),驾驶一辆车执行任务一段时间,然后最终回到第一辆车。显然,这并不像一个车手停在一辆车那样高效。

基于任务的并行性的想法是将工作分解为可以在将来产生结果的任务,然后有效地分配尽可能多的线程有处理器,所以你不要浪费时间上下文切换。在实践中,它通常不能很好地解决,但这就是想法。

  

哪一个更好,任务还是线程?

这个问题无法回答,因为它没有任何意义。哪个更好,是一本交付给客户的书,还是一辆提供给它的汽车?汽车是一种可用于交付书籍的设备;这两件事并不是你可以理智地描述为比另一件更“好”或“更差”的东西。这就像问“哪个更好,一个洞或一个钻头?”

答案 1 :(得分:18)

“任务”是一项将在未来的某个时刻执行并完成的工作。

“线程”是指某事被执行的方式。

通常,当您创建任务时,默认情况下(即:使用Task.Factory.StartNew),Task将在某个时刻使用计划在ThreadPool线程上运行。但是,情况并非总是如此。

实现这种分离的好处在于您允许框架(或者您自己,如果您使用自定义TaskScheduler)来控制 您的工作如何映射到可用线程。通常,您将拥有比线程更多的工作项 - 您可能需要处理一百万个项目,但系统中只有8个核心。在这种情况下,使用固定数量的线程并使每个线程处理多个工作项更有效。通过将“任务”与“线程”分开,你就打破了这种工作==线程的耦合。

通常,我建议使用Task而不是创建自己的线程。这是一个用于开发的更好,更强大,更灵活的模型,特别是因为它允许您以非常干净的方式处理异常,允许生成诸如continuation之类的好东西等。

答案 2 :(得分:6)

以下是一些差异:

  • Task 默认使用线程池,而直接使用Thread则需要创建新线程。
  • Task将处理异常和结果,以便更轻松地使用它。
  • Task可以在使用线程时支持取消,您必须自己实现。

答案 3 :(得分:5)

任务表示您要执行的操作或工作。

线程可能是有效的行动者或工作人员之一。

答案 4 :(得分:4)

根据MSDN reference documentation

  

任务并行库(TPL)是.NET Framework第4版中System.Threading和System.Threading.Tasks命名空间中的一组公共类型和API .TPL的目的是通过以下方式提高开发人员的工作效率:简化了向应用程序添加并行性和并发性的过程。 TPL动态地扩展并发度,以最有效地使用所有可用的处理器。此外,TPL处理工作的分区,ThreadPool上的线程调度,取消支持,状态管理和其他低级细节。通过使用TPL,您可以最大限度地提高代码的性能,同时专注于您的程序旨在完成的工作。

因此,似乎Task是编码异步操作的首选方法,因为框架会处理大部分工作。但另一方面,Thread仍可用于现有代码以及您明确要分配和管理OS线程的情况。