.NET4.5新特性之非同步編程(Async和Await)的使用

來源:互聯網
上載者:User

標籤:介紹   visual   ini   start   msdn   tar   second   ram   技術   

一、簡介

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

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

二、使用說明
  • 方法簽名包含一個 Async 或 async 修飾符。
  • 按照約定,非同步方法呼叫的名稱以“Async”尾碼結尾。
  • 傳回型別為下列類型之一:
    • 如果你的方法有運算元為 TResult 類型的返回語句,則為 Task。
    • 如果你的方法沒有返回語句或具有沒有運算元的返回語句,則為 Task。
    • Sub in Visual Basic) if you’re writing an async event handler.”>如果你編寫的是非同步事件處理常式,則為 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 Taskint> SumAsync(int part)        {            if ((part += 10) >= 100)            {                return 100;            }            HttpClient client = new HttpClient();            Taskstring> 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();            Taskstring> 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毫秒。執行過程非同步於主線程。

四、尾語

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

.NET4.5新特性之非同步編程(Async和Await)的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.