首先來看看.net的發展中的各個階段的特性:NET 與C# 的每一個版本發佈都是有一個「主題」。即:C#1.0託管代碼→C#2.0泛型→C#3.0LINQ→C#4.0動態語言→C#4.5異步編程express
下面我來簡單的介紹一下異步編程:異步編程,在 .NET Framework 4.5 和 Windows 運行時利用異步支持。 編譯器可執行開發人員曾進行的高難度工做,且應用程序保留了一個相似於同步代碼的邏輯結構。 所以,你只需作一小部分工做就能夠得到異步編程的全部好處。(https://msdn.microsoft.com/zh-cn/library/hh191443.aspx)編程
所謂的異步編程是利用CPU空閒時間和多核的特性,它所返回的Task或Task<TResult>是對await的一個承諾,當任務執行完畢後返回一個結果給接收者。這裏看到這個可能各位不太明白,沒關係,下面會有講解。app
方法簽名包含一個 Async 或 async 修飾符。異步
按照約定,異步方法的名稱以「Async」後綴結尾。async
返回類型爲下列類型之一:異步編程
若是你的方法有操做數爲 TResult 類型的返回語句,則爲 Task<TResult>。學習
若是你的方法沒有返回語句或具備沒有操做數的返回語句,則爲 Task。ui
若是你編寫的是異步事件處理程序,則爲 Void(Visual Basic 中爲 Sub)。this
有關詳細信息,請參見本主題後面的「返回類型和參數」。spa
方法一般包含至少一個 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)利用異步編程的方式實現(2)利用普通同步方式實現
二、同時這個例子中實現了遞歸,這個能夠不用考慮,博主只是想驗證一下在異步的狀況下,遞歸是否有效而已,實驗結果爲有效。
三、這段代碼中的GetStringAsync()方法是獲取遠程界面內容用的,主要目的是延長響應時間。
程序結果以下:
結果說明:
一、同步方法按規矩進行,有條不紊。
二、異步方法直接執行完畢,用時7毫秒。執行過程異步於主線程。
微軟的官方文檔很值得學習,你們感興趣的能夠看看去。這裏引一個流程原理圖,所對應的示例到文檔中去看,連接上方已給。
(源程序感興趣的能夠留言,我隨時提供)