await 關鍵字不會創建新的線程,而是由Task任務或是FCL中的xxxAsync等方法創建的線程,而且這裡創建的線程都是基於線程池創建的工作線程,屬於後臺線程。 await關鍵字會阻塞/暫停調用它的方法,也即下麵的 Phycology 方法.當阻塞其調用方法的時候,程式會回到UI線程中去執行,也 ...
await 關鍵字不會創建新的線程,而是由Task任務或是FCL中的xxxAsync等方法創建的線程,而且這裡創建的線程都是基於線程池創建的工作線程,屬於後臺線程。
await關鍵字會阻塞/暫停調用它的方法,也即下麵的 Phycology 方法.當阻塞其調用方法的時候,程式會回到UI線程中去執行,也就是main方法中去執行,這點可以通過
C#中 Thread,Task,Async/Await,IAsyncResult 的那些事兒! 其內的程式來判斷.
async & await 組合的程式片段一定要註意使用,在此列舉幾個註意事項,也可以說是優化事項。我將其放到了代碼的註釋部分,這樣更方便你理解:
/// <summary> /// ....各類書籍推薦... /// /// 應當在此處呈現await的返回值... /// </summary> /// <param name="args"></param> static void Main(string[] args) { //第一類書籍:心理學.... var book = new List<book>() { new book() { book_classify = "心理學", book_name = "每一種孤獨都有陪伴" }, new book() { book_classify = "心理學", book_name = "願你擁有被愛照亮的生命" }, new book() { book_classify = "心理學", book_name = "感謝自己的不完美" }, new book() { book_classify = "編程語言", book_name = "編寫高質量代碼 改善C#程式的157個建議" }, new book() { book_classify = "編程語言", book_name = "python cookbook" }, new book() { book_classify = "編程語言", book_name = "設計模式(C#版)" } }; //var test = book.Where(p => p.book_classify == "心理學").Select(p => p.book_name); //foreach(var i in test) //{ // Console.WriteLine(i); //} var task = handle(book); Console.WriteLine(task.Result); } /// <summary> /// Attention: /// 在這裡取出我們通過Task任務放到線程池中處理並返回的數據,同時註意 /// 除了傳遞非同步調用方法(這裡是 Phycology方法)之外,因為可能需要做其他的操作, /// 我們可以將await關鍵字放在非同步調用方法返回的變數處,而不是直接使用await關鍵字去等待調用方法 /// 這樣設計充分利用了時間,提高了效率... /// </summary> /// <param name="book"></param> /// <returns></returns> public static async Task<string> handle(List<book> book) { var _physchology = Phycology(book); var _programmer = Programmer(book); ///在這裡做一些其他的操作... ///以充分利用時間 return await _physchology + await _programmer; } /// <summary> /// Attention: /// 應當將需要的數據返回到調用方法處... /// 在這裡是 sb /// </summary> /// <param name="book"></param> /// <returns></returns> public static async Task<string> Programmer(List<book> book) { StringBuilder sb = new StringBuilder(); return await Task.Run(() => { var programmer = book.Where(p => p.book_classify == "編程語言").Select(p => p.book_name).ToList(); foreach(var i in programmer) { sb.Append(i + "\r\n"); } return sb.ToString(); }); } public static async Task<string> Phycology(List<book> book) { StringBuilder sb = new StringBuilder(); return await Task.Run(() => { var _phychology = book.Where(p => p.book_classify == "心理學").Select(p => p.book_name).ToList(); foreach(var i in _phychology) { sb.Append(i + "\r\n"); } return sb.ToString(); }); } }
最後的實現: