最近朋友問起await 和 async第一次聽說這個await ,就查了一下這個await使用在於 異步方法async 中,中文意思就是等待,經過一系列的百度參考簡單的明白了這個東西的意思, 異步方法執行時,等待await 標識語句(存儲結果或運算結果)完成,再執行異步方法中后續語句,await用來讓異步方法等待一個結果的產生(http://www.cnblogs.com/liqingwen/p/5922573.html#link6) 看這段理解不太明白,別心急,看下面代碼結合運行結果。
代碼示例:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net.Http; 5 using System.Text; 6 using System.Threading; 7 using System.Threading.Tasks; 8 9 namespace 異步調用 10 { 11 class Program 12 { 13 14 static void Main(string[] args) 15 { 16 17 Console.WriteLine("非異步操作"); 18 19 var result = ansyPrint("異步操作"); 20 21 Console.WriteLine("非異步操作繼續執行..."); 22 Console.WriteLine("非異步操作執行結束..."); 23 Console.ReadKey(true); 24 25 } 26 27 public static async Task<int> ansyPrint(string s) 28 { 29 //記得 using System.Net.Http 哦 30 var client = new HttpClient(); 31 Console.WriteLine("異步方法開始執行:" + s); 32 //執行異步方法 GetStringAsync 33 Task<string> getStringTask = client.GetStringAsync("http://www.baidu.com/"); 34 35 //假設在這里執行一些非異步的操作 36 Console.WriteLine("1"); 37 Console.WriteLine("2"); 38 //插在 費異步操作其中 39 string urlContents = await getStringTask; 40 Console.WriteLine("3"); 41 42 Console.WriteLine("異步方法執行結束:" + s); 43 //返回字符串的長度(int 類型) 44 return urlContents.Length; 45 } 46 } 47 }
運行結果:
總結:
通過運行結果可以看出 當執行到 await getStringTask;時 ,就跳回 主線程執行操作,掛起異步方法中 下載網頁操作,但不影響主線程的操作。
然后簡單說明一下 異步方法 其中的正常運算(加減乘除或調用其他方法)不是異步操作,而是當碰到await時 之后的操作才能算是 真正的異步操作,畢竟是遇到await時才回跳到異步方法之后,由此可以看出 異步操作其實就是一個回調方法。
/// 異步方法聲明的 3 要素: /// ① async 修飾符 /// ② 返回類型 Task 或 Task<TResult>:這里的 Task<int> 表示 return 語句返回 int 類型 /// ③ 方法名以 Async 結尾 public static async Task<int> ansyPrint(string s) { //await 用在 異步方法中 //await 等待 異步方法結果也就是Task<TResult>類型
return result;
}
聯想的一些內容:
然后看到這里的時候,我就去問我的那個朋友 (他是搞前端的)這樣主線程跟異步操作之間是啥關系,我就跟他闡述一遍我上面自己得到的結論,然后我在自己的文字中發現了一個問題這個 異步操作而不是異步線程,那這兩個是有啥區別呢,抱着閑來無事求證的想法,從字面來講這兩個東西確實比較相似,但追求其原理還是有一定的區別,在看了(http://www.cnblogs.com/dream844/archive/2012/06/12/2546083.html)之后有了一定的理解,我只簡單說一下我的理解,詳細還是看↑這個大佬的。
異步操作:
硬件在和內存進行數據交換的時候可以不消耗CPU資源。只要CPU在發起數據傳輸時發送一個指令,硬件就開 始自己和內存交換數據,在傳輸完成之后硬件會觸發一個中斷來通知操作完成。這些無須消耗CPU時間的I/O操作正是異步操作的硬件基礎。我個人認為偏向於 數據存儲交換。
多線程:
線程是CPU的概念,是操作系統的一種功能,也就是 操作系統對CPU的使用方法,我個人認為 偏向於邏輯運算。
總結:
可是總起來說這樣理解很是淺,但也能指出大概想法, 不過異步並不是減少對線程的使用,可以上面的例子 想象一下 在主線程只是的時候,異步也在進行操作,其實也就是開了一條子線程,當異步操作完畢,又回到主線程,只是占用的時間相對來說減少一些。 我大概設想,但真正是不是異步操作執行完畢又回到主線程幾率不大(其實是系統隨機,便於理解),不過最后只是占用了一條線程而不是多條。