這段時間在項目開發中看到了一些async/await的使用,在aspnet core的host組件源碼中也看到了許多的async/await代碼。在開發時,正確的使用了async/await是能夠提升程序的性能。下面的代碼教你正確的理解await關鍵字的暫停/阻塞方法調用:async
static void Main(string[] args) { Console.WriteLine("-------主線程啓動-------"); var task = GetStrLengthAsync(); Console.WriteLine("主線程繼續執行"); Console.WriteLine("Task返回的值: " + task.Result); Console.WriteLine("-------主線程結束-------"); Console.Read(); } static async Task<string> GetStrLengthAsync() { Console.WriteLine("GetStrLengthAsync方法開始執行"); var str = await GetString(); Console.WriteLine("GetString方法調用結束"); var str1 =await GetStringOne(); Console.WriteLine("GetStringOne方法調用結束"); Console.WriteLine("GetStrLengthAsync方法執行結束"); return str + " ###### " + str1; }
///await關鍵字會暫停/阻塞其所在的方法,返回調用 await關鍵字所在的方法處 繼續執行,而不是接着await關鍵字所在的代碼處往下執行,註釋下面的代碼,查看運行結果便可確認。
//static async Task<string> GetStrLengthAsync()
//{
// Console.WriteLine("GetStrLengthAsync方法開始執行");性能
// var str = GetString();
// Console.WriteLine("GetString方法調用結束");spa
// var str1 = GetStringOne();
// Console.WriteLine("GetStringOne方法調用結束");線程
// Console.WriteLine("GetStrLengthAsync方法執行結束");
// return await str + " ###### " + await str1;
//}code
static async Task<string> GetString() { Console.WriteLine("GetString方法開始執行"); return await Task.Run(() => { Thread.Sleep(2000); return "GetString的返回值"; }); } static async Task<string> GetStringOne() { Console.WriteLine("GetStringOne方法開始執行"); return await Task.Run(() => { Thread.Sleep(2000); return "GetStringOne的返回值"; }); }
await關鍵字會阻塞/暫停它所在的方法。根據結果便可判斷:blog
//主線程啓動
//GetStrLengthAsync方法開始執行
//GetString方法開始執行
//主線程繼續執行
//GetString方法調用結束
//GetStringOne方法開始執行
//GetStringOne方法調用結束
//GetStrLengthAsync方法執行結束
//Task返回的值:
//主線程結束
//主線程啓動
//GetStrLengthAsync方法開始執行
//GetString方法開始執行
//GetString方法調用結束
//GetStringOne方法開始執行
//GetStringOne方法調用結束
//GetStrLengthAsync方法執行結束
//主線程繼續執行
//Task返回的值:
//主線程結束