.Net 異步方法, await async 使用

    最近朋友問起await  和 async第一次據說這個await ,就查了一下這個await使用在於 異步方法async 中,中文意思就是等待,通過一系列的百度參考簡單的明白了這個東西的意思,  異步方法執行時,等待await 標識語句(存儲結果或運算結果)完成,再執行異步方法中後續語句,await用來讓異步方法等待一個結果的產生(http://www.cnblogs.com/liqingwen/p/5922573.html#link6) 看這段理解不太明白,別心急,看下面代碼結合運行結果html

代碼示例:

 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操做正是異步操做的硬件基礎。我我的認爲偏向於 數據存儲交換async

  多線程:

    線程是CPU的概念,是操做系統的一種功能,也就是 操做系統對CPU的使用方法,我我的認爲 偏向於邏輯運算url

  總結:

  但是總起來講這樣理解非常淺,但也能指出大概想法, 不過異步並非減小對線程的使用,能夠上面的例子 想象一下 在主線程只是的時候,異步也在進行操做,其實也就是開了一條子線程,當異步操做完畢,又回到主線程,只是佔用的時間相對來講減小一些。 我大概設想,但真正是否是異步操做執行完畢又回到主線程概率不大(實際上是系統隨機,便於理解),不過最後只是佔用了一條線程而不是多條。spa

相關文章
相關標籤/搜索