異步編程是指程序在執行異步操作時,無法馬上獲得結果,而在異步操作過程中,程序可以執行其他操作,當異步操作完成時,通過狀態,通知,回調等來告知調用者。異步編程的好處是顯而易見的,比如WEB應用,如果不是採用異步編程,那麼當客戶端向服務器發送請求時,在得到服務器響應的過程中,客戶端都處於一種等待狀況,用戶無法對其進行相關的操作,這樣的用戶體驗顯然是非常差的。
C#異步編程有3種實現方式,第一種是APM(Asynchromous Programming Model ),.net類庫中的Beginxxx和Endxxx方法其實就實現了異步編程,當然用戶也可以自定義實現異步操作的類,要求這個類實現返回類型爲IAsyncResult的Beginxxx和Endxxx方法。
第二種是 async / await ,一下爲教科書上的一段代碼,
async
Task<int>
AccessTheWebAsync()
{
HVpClient client = new HVpClient();
Task<string> getStringTask = client.GetStringAsync("hVp://msdn.microsod.com");
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
這種方式有一個問題需要特別注意,就是對於只標識async關鍵字的(指在方法內沒有出現await關鍵字)的方法,調用線程會把 該方法當成同步方法一樣執行,所以還是會堵塞GUI線程,只有當async和await關鍵字同時出現,該方 法才被轉換爲異步方法處理。
第三種爲HttpClient和WebClient,HttpWebRequest有一些區別:
1、在HttpClient實例上配置擴展,設置默認的頭部,取消未完成的請求和更多的設置。
2、你通過一個單一的HttpClient實例,它有自己的連接池。
3、HttpClients不與特定的HTTP服務器綁定,你可以使用相同的HttpClient實例提交任 何HTTP請求。
4、你可以用HttpClient爲特定的站點創建特殊的Client
5、HttpClient採用新的型模式處理異步請求使它更容易管理和協調更多的請求