.Net 異步方法, await async 使用


    最近朋友問起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的使用方法,我個人認為 偏向於邏輯運算

  總結:

  可是總起來說這樣理解很是淺,但也能指出大概想法, 不過異步並不是減少對線程的使用,可以上面的例子 想象一下 在主線程只是的時候,異步也在進行操作,其實也就是開了一條子線程,當異步操作完畢,又回到主線程,只是占用的時間相對來說減少一些。 我大概設想,但真正是不是異步操作執行完畢又回到主線程幾率不大(其實是系統隨機,便於理解),不過最后只是占用了一條線程而不是多條。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM