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的执行状态。