任务和线程有什么区别?

在C#4.0中,我们有System.Threading.Tasks命名空间中的TaskThreadTask之间的真正区别是什么? 我为了自己的学习做了一些示例程序(帮助从MSDN中获得)

Parallel.Invoke 
Parallel.For 
Parallel.ForEach 

但有很多疑问,因为这个想法不太清楚。

我最初在Stackoverflow中搜索了一个类似的问题,但可能与这个问题标题无法得到相同的结果。 如果有人知道此前发布的相同类型的问题,请给出链接的参考。


一项任务是你想完成的事情。

线程是执行该任务的许多可能的工作人员之一。

在.NET 4.0中,任务表示一个异步操作。 线程用于完成该操作,方法是将工作分解为块并分配给单独的线程。


在计算机科学方面, Task是未来或承诺。 (有些人使用这两个词synomymously,有些人使用它们不同,没有人可以同意一个确切的定义。)基本上, Task<T> “承诺”返回给你一个T ,但不是现在亲爱的,我有点忙,你为什么不晚回来?

Thread是实现这一承诺的一种方式。 但并非每个Task需要一个全新的Thread 。 (实际上,创建一个线程通常是不可取的,因为这样做比重用线程池中的现有线程要昂贵得多。)如果您正在等待的值来自文件系统或一个数据库或网络,那么当线程可以服务于其他请求时,就不需要线程坐下来等待数据。 相反, Task可能会注册一个回调,以在准备好时接收值。

特别是,该Task并没有说明为什么需要这么长时间才能返回价值。 这可能需要很长时间来计算,或者它可能需要很长时间才能获取。 只有在前一种情况下,您才会使用Thread来运行Task 。 (在.NET中,线程非常昂贵,所以你通常希望尽可能避免它们,如果你想要在多个CPU上运行多个繁重的计算,真的只用它们。例如,在Windows中,线程的重量为12 KiByte我认为),在Linux中,一个线程只有4 KiByte,在Erlang / BEAM中甚至只有400 Byte,在.NET中它只有1 MiByte!)


当我们在多个线程上执行某些事情时,并不能保证线程在多个处理器之间分离。

任务是用于管理可并行工作单元的轻量级对象。 只要你想并行执行某些东西,就可以使用它。 并行意味着工作分散在多个处理器上以最大化计算速度。 调整任务以利用多核处理器。

任务通过线程提供以下强大功能。

  • 如果系统有多个任务,那么它在内部使用CLR线程池,因此不需要使用线程创建专用线程相关的开销。 还可以减少多个线程之间的上下文切换时间。
  • 任务可以返回一个结果。没有直接的机制从线程返回结果。
  • 等待一组任务,没有信号结构。

  • 我们可以将任务链接在一起以便一个接一个地执行。

  • 从另一个任务开始一个任务时建立父母/子女关系。

  • 子任务异常可以传播给父任务。

  • 任务支持通过使用取消令牌取消。

  • 使用“异步”和“等待”关键字,异步实现非常容易。

  • 链接地址: http://www.djcxy.com/p/96383.html

    上一篇: What is the difference between task and thread?

    下一篇: static function pointer in a class constructor