前言html
最近本身在研究Asp.Net Web API。在看到經過客戶端來調用Web API的時候,看到了其中的異步編程,因爲本身以前沒有接觸過,因此就稍微的學習瞭解一下。這兩篇文章是:web
Calling a Web API From a .NET Client (C#) http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client編程
Calling a Web API From a WPF Application(C#) http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-wpf-applicationapi
關於異步編程的簡單理解:多線程
在.NET4.5中新增了異步編程的新特性async和await,使得異步編程更爲簡單。經過特性能夠將這項複雜的工做交給編譯器來完成了。以前傳統的方式來實現異步編程較爲複雜,這樣對於程序猿來講處理起來比較困難,調試也沒那麼方便,後續的維護工做也比較痛苦。
app
Async和Await關鍵字是C#異步編程的核心。經過使用這兩個關鍵字,你可使用.NET Framework 或 Windows Runtime的資源建立一個異步方法如同建立一個同步方法同樣容易。asp.net
這裏還有兩篇是我以前對多線程簡單學習的入門異步
http://www.cnblogs.com/aehyok/archive/2013/05/02/3054615.htmlasync
http://www.cnblogs.com/aehyok/archive/2013/05/02/3055524.html異步編程
接下來經過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表達式。
關於async和await的學習暫時就這麼多,皮毛的皮毛,不過暫時已經足夠了,等有時間了能夠再深刻的進行研究。