C#中Task和Thread有区别吗?

Task和Thread都能创建用多线程的方式执行代码,但它们有较大的区别。

Task是将多个操作封装成一个概念上原子操作。但这个操作由哪个Thread甚至多个Thread来处理处理你并不清楚。总之就是可以被正常完成。.

Thread仅仅是一条线程,所有操作都是这个Thread一个完成的。

thread是单核多线程,task是多核多线程。

Task较新,发布于.NET 4.5,能结合新的async/await代码模型写代码,它不止能创建新线程,还能使用线程池(默认)、单线程等方式编程,在UI编程领域,Task还能自动返回UI线程上下文,还提供了许多便利API以管理多个Task。用表格总结如下:

区别 Task Thread
.NET版本 4.5+ 1.1
async/await 支持 不支持
创建新线程 支持 支持
线程池/单线程 支持 不支持
返回主线程 支持 不支持
管理API 支持 不支持

开始一个Task ,Task.Run

开始一个Task最简单的办法就是使用Task.Run(.net4.5,4.0的时候是Task.Factory.StartNew)传入一个Action委托即可(例子task)

Task.Run(()=>{  Console.WriteLine("do it"); });
  • Task默认使用线程池,也就是后台线程:当主线程结束时,你创建所有的tasks都会结束。

  • Task.Run返回一个Task对象,可以使用它来监视其过程

  • 在Task.Run之后,我们没有调用Start,因为该方法创建的是“热”任务(hot task)

  • 可以通过task的构造函数创建“冷”任务(cold task),但开发中很少这么干

  • 通过Task的Status属性来跟踪task的执行状态。