.net4.5新特性之異步編程(Async和Await)的使用


一、簡介

  首先來看看.net的發展中的各個階段的特性:NET 與C# 的每個版本發布都是有一個“主題”。即:C#1.0托管代碼→C#2.0泛型→C#3.0LINQ→C#4.0動態語言→C#4.5異步編程

  下面我來簡單的介紹一下異步編程:異步編程,在 .NET Framework 4.5 和 Windows 運行時利用異步支持。 編譯器可執行開發人員曾進行的高難度工作,且應用程序保留了一個類似於同步代碼的邏輯結構。 因此,你只需做一小部分工作就可以獲得異步編程的所有好處。(https://msdn.microsoft.com/zh-cn/library/hh191443.aspx

  所謂的異步編程是利用CPU空閑時間和多核的特性,它所返回的Task或Task<TResult>是對await的一個承諾,當任務執行完畢后返回一個結果給接收者。這里看到這個可能各位不太明白,不要緊,下面會有講解。

二、使用說明

  • 方法簽名包含一個 Async 或 async 修飾符。

  • 按照約定,異步方法的名稱以“Async”后綴結尾。

  • 返回類型為下列類型之一:

    • 如果你的方法有操作數為 TResult 類型的返回語句,則為 Task<TResult>

    • 如果你的方法沒有返回語句或具有沒有操作數的返回語句,則為 Task

    • 如果你編寫的是異步事件處理程序,則為 Void(Visual Basic 中為 Sub)。

    有關詳細信息,請參見本主題后面的“返回類型和參數”。

  • 方法通常包含至少一個 await 表達式,該表達式標記一個點,在該點上,直到等待的異步操作完成方法才能繼續。 同時,將方法掛起,並且控件返回到方法的調用方。(這里所謂的掛起就是上文所提到的承諾,異步方法承諾會給調用方一個結果)

三、示例

  實踐才是檢驗真知的最佳途徑。

using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;

namespace 異步遞歸
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            ConsoleAsync1();
            stopwatch.Stop();
            Console.WriteLine("同步方法用時:" + stopwatch.ElapsedMilliseconds);
            stopwatch.Reset();
            stopwatch.Start();
            ConsoleAsync();
            stopwatch.Stop();
            Console.WriteLine("異步方法用時:"+ stopwatch.ElapsedMilliseconds);

            Console.Read();
        }

        private static async void ConsoleAsync()
        {
            Console.WriteLine("異步方法開始");
            Console.WriteLine("Result:" + await SumAsync(10));
            Console.WriteLine("異步方法結束");
        }
        private static async Task<int> SumAsync(int part)
        {
            if ((part += 10) >= 100)
            {
                return 100;
            }
            HttpClient client = new HttpClient();
            Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
            Console.WriteLine(DateTime.Now.Millisecond + " 異步 " + (await getStringTask).Length);
            return await SumAsync(part);
        }

        private static void ConsoleAsync1()
        {
            Console.WriteLine("同步方法開始");
            Console.WriteLine("Result:" + SumAsync1(10));
            Console.WriteLine("同步方法結束");
        }

        private static int SumAsync1(int part)
        {
            if ((part += 10) >= 100)
            {
                return 100;
            }
            HttpClient client = new HttpClient();
            Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
            Console.WriteLine(DateTime.Now.Millisecond + " 同步 " + getStringTask.Result.Length);
            return SumAsync1(part);
        }
    }
}

  示例介紹:

    1、這個例子中有兩種實現方式:(1)利用異步編程的方式實現(2)利用普通同步方式實現

    2、同時這個例子中實現了遞歸,這個可以不用考慮,博主只是想驗證一下在異步的情況下,遞歸是否有效而已,實驗結果為有效。

    3、這段代碼中的GetStringAsync()方法是獲取遠程界面內容用的,主要目的是延長響應時間。

程序結果如下:

    

  結果說明:

    1、同步方法按規矩進行,有條不紊。

    2、異步方法直接執行完畢,用時7毫秒。執行過程異步於主線程。

四、尾語

  微軟的官方文檔很值得學習,大家感興趣的可以看看去。這里引一個流程原理圖,所對應的示例到文檔中去看,鏈接上方已給。

    跟蹤異步程序

(源程序感興趣的可以留言,我隨時提供)


免責聲明!

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



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