Task和Thread有什么区别?

san*_*osh 25 c# multithreading .net-4.0

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

Eri*_*ert 60

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

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

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

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

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

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

  • 很好比喻.我之前没有看到过如此清楚的解释 (8认同)
  • `哪一个更好,任务还是线程?`我认为OP意味着使用`Thread`类而不是使用`Task <T>`而不是线程本身. (5认同)
  • @HansRudel:我不是否认TPL太棒了,所以让我在这一点上说清楚:**TPL真棒**.它非常善于解决某类问题.但**没有人说过他们想要解决的具体问题**,所以我无法提出全面的建议.说"总是使用任务"或"从不使用线程"将是愚蠢的; 有些问题是TPL非常善于为您解决问题,以及您希望对各个员工进行低级别控制的一些问题. (3认同)
  • 好吧,如果我们谈论任务和线程你是对的,但如果我们谈论Task和Thread类你就错了:)因为这些类并不是彼此不同的. (2认同)
  • @santosh我个人认为你应该忽视Lippert先生的最后一段..NET 4.0最重要的特性之一是包含任务并行库(TPL),原因有两个.1)它简化了多线程的创建和使用.2)它自动使用多个处理器.在你可以使用TPL之前,你仍然需要熟悉线程,但是一旦你熟悉它,id坚持使用TPL,它将使你的生活变得更容易. (2认同)

Ree*_*sey 18

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

"线程"是指某事被执行的方式.

通常,当您创建一个Task时,默认情况下(即:using Task.Factory.StartNew),Task将在某个时刻获得Scheduled以在ThreadPool线程上运行.然而,这并非总是如此.

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

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


Ali*_*tad 6

以下是一些差异:

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

  • 由TaskScheduler决定运行任务的位置和方式.默认的调用程序使用ThreadPool(除非设置了LongRunning提示,在这种情况下,Task获取专用线程),但调度程序可以执行任何想要的操作.此外,通常使用基于当前SynchronizationContext的调度程序运行continuation.我在这里写过关于安排的文章:http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/ (2认同)

Rag*_*hav 5

一个任务是指一个动作或工作,你想做的事情.

一个线程可以执行者或工人perforimg的工作之一.