1. 程式人生 > >.NET4.5新特性之非同步程式設計(Async和Await)的使用

.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 執行時利用非同步支援。

  所謂的非同步程式設計是利用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 表示式,該表示式標記一個點,在該點上,直到等待的非同步操作完成方法才能繼續。 同時,將方法掛起,並且控制元件返回到方法的呼叫方。(這裡所謂的掛起就是上文所提到的承諾,非同步方法承諾會給呼叫方一個結果)

三、示例

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

C#
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 usingSystem;usingSystem.Diagnostics;usingSystem.Net.Http;usingSystem.Threading.Tasks;namespace非同步遞迴{classProgram{staticvoidMain(string[]args){Stopwatch stopwatch=newStopwatch();stopwatch.Start();ConsoleAsync1();stopwatch.Stop();Console.WriteLine("同步方法用時:"+stopwatch.ElapsedMilliseconds);stopwatch.Reset();stopwatch.Start();ConsoleAsync();stopwatch.Stop();Console.WriteLine("非同步方法用時:"+stopwatch.ElapsedMilliseconds);Console.Read();}privatestaticasyncvoidConsoleAsync(){Console.WriteLine("非同步方法開始");Console.WriteLine("Result:"+awaitSumAsync(10));Console.WriteLine("非同步方法結束");}privatestaticasyncTaskint>SumAsync(intpart){if((part+=10)>=100){return100;}HttpClient client=newHttpClient();Taskstring>getStringTask=client.GetStringAsync("http://msdn.microsoft.com");Console.WriteLine(DateTime.Now.Millisecond+" 非同步 "+(awaitgetStringTask).Length);returnawaitSumAsync(part);}privatestaticvoidConsoleAsync1(){Console.WriteLine("同步方法開始");Console.WriteLine("Result:"+SumAsync1(10));Console.WriteLine("同步方法結束");}privatestaticintSumAsync1(intpart){if((part+=10)>=100){return100;}HttpClient client=newHttpClient();Taskstring>getStringTask=client.GetStringAsync("http://msdn.microsoft.com");Console.WriteLine(DateTime.Now.Millisecond+" 同步 "+getStringTask.Result.Length);returnSumAsync1(part);}}}

示例介紹:

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

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

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

程式結果如下:

1

結果說明:

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

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

四、尾語

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

跟蹤非同步程式

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