.net4.5使用async和await非同步程式設計例項
阿新 • • 發佈:2019-02-10
在.NET4.5中新增了非同步程式設計的新特性async和await,使得非同步程式設計更為簡單。通過特性可以將這項複雜的工作交給編譯器來完成了。之前傳統的方式來實現非同步程式設計較為複雜,這樣對於程式猿來說處理起來比較困難,除錯也沒那麼方便,後續的維護工作也比較痛苦。
Async和Await關鍵字是C#非同步程式設計的核心。通過使用這兩個關鍵字,你可以使用.NET Framework 或 Windows Runtime的資源建立一個非同步方法如同建立一個同步方法一樣容易。
接下來通過VS2013 建立一個基於.NET4.5的控制檯應用程式進行嘗試。
上面註釋中也有進行說明,第一個是同步方法,第二個是非同步方法。同步方法可以通過Thread.Sleep(1000);暫停方法執行1000ms,同樣的非同步方法可以通過await Task.Delay(1000)來處理,而且在非同步方法的宣告中要加入async的關鍵字。
接下來是簡單的呼叫
F5執行後結果如下
通過執行其實和同步的是一樣的,只不過看看如何來定義非同步方法的返回值,根據Task<T>來進行定義。
如果指定Task<TResult>為返回結果,那麼這個方法必須包含return指定的TResult結果的語句。
一個async方法裡通常包含一個或多個的對應的await操作符,但如果沒有await表示式也不會導致編譯錯誤。但如果呼叫一個async方 法,卻不使用await關鍵字來標記一個掛起點的話,程式將會忽略async關鍵字並以同步的方式執行
總結
1.一個非同步方法的宣告中必然包含一個async的修飾符。
2.非同步方法的方法名可以以“Async”結尾。
3.Task<TResult> 當你的方法有返回值時,那麼TResult即返回值的型別
4.方法通常至少包含一個await表示式。
Async和Await關鍵字是C#非同步程式設計的核心。通過使用這兩個關鍵字,你可以使用.NET Framework 或 Windows Runtime的資源建立一個非同步方法如同建立一個同步方法一樣容易。
接下來通過VS2013 建立一個基於.NET4.5的控制檯應用程式進行嘗試。
先直接把簡單的程式碼貼出來,如下所示
/// <summary> /// 同步方法列印Hello World /// </summary> public static void PrintHelloWorld() { Console.WriteLine("同步方法呼叫開始"); Console.WriteLine("同步方法:Hello World"); Thread.Sleep(1000); Console.WriteLine("退出同步方法"); } /// <summary> /// 非同步方法列印Hello World /// </summary> public async static void AsyncPrintHelloWorld() { Console.WriteLine("非同步方法呼叫開始"); Console.WriteLine("非同步方法:Hello World"); await Task.Delay(1000); Console.WriteLine("退出非同步方法"); }
上面註釋中也有進行說明,第一個是同步方法,第二個是非同步方法。同步方法可以通過Thread.Sleep(1000);暫停方法執行1000ms,同樣的非同步方法可以通過await Task.Delay(1000)來處理,而且在非同步方法的宣告中要加入async的關鍵字。
接下來是簡單的呼叫
static void Main(string[] args) { Console.WriteLine("======同步方法呼叫====="); PrintHelloWorld(); Console.WriteLine("同步方法呼叫結束"); Console.WriteLine("======非同步方法呼叫====="); AsyncPrintHelloWorld(); Console.WriteLine("非同步方法呼叫結束"); Console.ReadLine(); }
F5執行後結果如下
通過執行結果可以很明顯的看出,呼叫的同步方法裡面是順序執行的,而在非同步方法中不一樣,當通過Task.Delay(1000)暫停當前方法的時候,其方法外面的下面的方法會繼續執行,也就是列印“非同步方法呼叫結束”的語句。
可以發現使用了關鍵字之後,同步與非同步的語法差別很小。隨著.NET4.5的推出,許多類庫和已有類庫都將支援這種新型的非同步語法,比如我正在學習的HTTPClient等等。
上面的演示只是通過簡單的void的方法進行演示的,當然肯定可以帶上返回值的額。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Async { class Program { static void Main(string[] args) { var ret = AsyncAdd("累死了,真想不出啥好的例子來呼叫"); Console.WriteLine(ret.Result); Console.ReadLine(); } ///非同步列印傳入的字串 public async static Task<string> AsyncAdd(string str) { string result = await PringString(str); return result; } public async static Task<string> PringString(string str) { return "Hello World" + str; } } }
通過執行其實和同步的是一樣的,只不過看看如何來定義非同步方法的返回值,根據Task<T>來進行定義。
如果指定Task<TResult>為返回結果,那麼這個方法必須包含return指定的TResult結果的語句。
一個async方法裡通常包含一個或多個的對應的await操作符,但如果沒有await表示式也不會導致編譯錯誤。但如果呼叫一個async方 法,卻不使用await關鍵字來標記一個掛起點的話,程式將會忽略async關鍵字並以同步的方式執行
總結
1.一個非同步方法的宣告中必然包含一個async的修飾符。
2.非同步方法的方法名可以以“Async”結尾。
3.Task<TResult> 當你的方法有返回值時,那麼TResult即返回值的型別
4.方法通常至少包含一個await表示式。