任务和线程有什么区别?
在C#4.0中,我们有System.Threading.Tasks命名空间中的Task
。 Thread
和Task
之间的真正区别是什么? 我为了自己的学习做了一些示例程序(帮助从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!)
当我们在多个线程上执行某些事情时,并不能保证线程在多个处理器之间分离。
任务是用于管理可并行工作单元的轻量级对象。 只要你想并行执行某些东西,就可以使用它。 并行意味着工作分散在多个处理器上以最大化计算速度。 调整任务以利用多核处理器。
任务通过线程提供以下强大功能。
等待一组任务,没有信号结构。
我们可以将任务链接在一起以便一个接一个地执行。
从另一个任务开始一个任务时建立父母/子女关系。
子任务异常可以传播给父任务。
任务支持通过使用取消令牌取消。
使用“异步”和“等待”关键字,异步实现非常容易。