先上一段代碼
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執行完畢之后才能繼續往下走。