.Net Task的用法(二)async和await
先上一段代码
static void Main(string[] args)
{
Console.WriteLine("1");
var task = Test();
Console.WriteLine("4");
Thread.Sleep(1000);
Console.WriteLine("5");
task.Wait();
Console.WriteLine("7");
Console.ReadKey();
}
static async Task Test()
{
//主线程
Console.WriteLine("2");
//主线程
await GetName();
Console.WriteLine("6");
}
static async Task GetName()
{
Console.WriteLine("3");
///开新线程
await Task.Run(() =>
{
Thread.Sleep(1000 * 5);
Console.WriteLine("5 new");
});
}
- 主线程中打印1,调用方法Test() 返回一个Task
- 主线程执行Test中方法 打印2,通过await 关键字等待GetName()方法执行完成
- 主线程执行GetName中的方法 打印3,之后主线程开启新的线程执行业务逻辑
- Main 方法中休眠1秒后打印4(因为打印4 之前并没有要求task 变量的 返回值或者等待,所有打印4的操作和新线程中的业务处理是同步的)
- 新线程中业务处理完成,Test中的await 通过,所有打印5
- 由于打印6之前要求了task 变量等待,所以当Test 执行完成后打印6
简单的理解就是 await 就是等待async 方法执行完成,async方法里面总能找到新开的线程
await并不是针对于async的方法,而是针对async方法所返回给我们的Task,这也是为什么所有的async方法都必须返回给我们Task。所以我们同样可以在Task前面也加上await关键字,这样做实际上是告诉编译器我需要等这个Task的返回值或者等这个Task执行完毕之后才能继续往下走。