• 环境:vs2019
  • .netCore

在很久之前学习Csharp时,课程上并没有Task的相关内容,那时候只学习过Thread线程系统。第一次认识到Task还是在使用Asp.net 进行异步请求时

首先,让我们下个定义,Task基于线程池的任务管理机制,比传统多线程更高效,比线程池更强大!

当你想更清晰的使用多线程或异步请使用Task吧。

Await和Asny

创建Task

在使用Task之前我们需要先创建Task。
Task 位于 System.Threading.Tasks;命名空间,使用前务必先导入。

方式一:直接使用Task构造创建

  • Task接受一个Action类型的委托,表示无参数无返回值类型。
  • 当我们使用泛型创建时,Task 接受一个Func类型的委托
//通过task构造创建任务
var ta = new Task(new Action(() => { Console.WriteLine("任务执行"); Thread.Sleep(1000); }));
var ta1 = new Task(() => { Console.WriteLine("任务1执行"); });
//带返回值的任务
var ta2 = new Task<int>(() => { Console.WriteLine("任务2执行"); return 100; });

方式二:使用静态工厂创建

使用静态工厂创建的任务,会直接启动无需Start

//通过工厂创建
var tsF = Task.Factory.StartNew(() => { Console.WriteLine("工厂任务执行"); });

Task完成回调

ta.Wait();//阻塞线程,等待task执行完毕
ta.ContinueWith((ts) => { Console.WriteLine("任务执行完毕"); });

对于有返回值的Task:

//获取任务结果,会导致当前线程阻塞。(相当于Wait)
Console.WriteLine("任务2返回值为:{0}",ta2.Result);

Task流程控制

父任务

深入分析Task

Task的一些使用案例

【待更新】