C#~異步編程續~.net4.5主推(tui)的await&async應用
之前寫過兩篇關于異步編程的文章,詳細可以進入C#~異步編程和C#~異步編程在項目中的使用
.net的(de)各(ge)個版本都有自(zi)己主推(tui)的(de)技術,像.NET1.1中(zhong)(zhong)的(de)委(wei)托,.NET2.0中(zhong)(zhong)的(de)泛(fan)型,.NET3.0中(zhong)(zhong)的(de)Linq,.NET4.0中(zhong)(zhong)的(de)Dynimac,而在(zai)(zai).NET4.5中(zhong)(zhong)主要(yao)推(tui)出的(de)是異步編(bian)程,而實現異步編(bian)程的(de)簡單方(fang)(fang)式(shi)就是使用await和async關(guan)鍵字(zi),而在(zai)(zai)新的(de).net托管類(lei)庫(ku)中(zhong)(zhong)已經(jing)大(da)大(da)使用了(le)這兩個關(guan)鍵字(zi),我們(men)在(zai)(zai)vs2010添(tian)加(jia)補丁和vs2012中(zhong)(zhong)都可以使用它(ta),在(zai)(zai)微軟(ruan)的(de)戰場上,我們(men)從(cong)來沒有見(jian)過(guo)異步編(bian)程這樣(yang)盛行過(guo),在(zai)(zai)推(tui)出.net4.5后,所以需要(yao)進(jin)行異步的(de)方(fang)(fang)法,都被實現了(le)同步和異步的(de)兩個版本,這給開發人員以大(da)大(da)的(de)方(fang)(fang)便!
下面舉(ju)出(chu)兩個例子來(lai)再次說明一個await和async的使用方法
一 將遠程圖像進行獲取,然后在瀏覽器上進行響應
#region 異步返回文件流(提高應用程序的吞吐能力) public async Task<ActionResult> AwaitFile() { var responseHtml = await GetResponseStream("//static.xuexiba.com/uploadfile/UserInfo/Avatar/201311/1302844759237319155175.jpg"); return File(responseHtml, "image/jpeg"); } private async Task<Stream> GetResponseStream(string url) { return await GetResponseContentAsync(url); } private async Task<Stream> GetResponseContentAsync(string url) { var httpClient = new System.Net.Http.HttpClient(); var response = await httpClient.GetAsync(url); if (response.StatusCode == System.Net.HttpStatusCode.OK) { return await response.Content.ReadAsStreamAsync(); } else { return null;//error } } #endregion
二 將遠程HTML文件進行獲取,然后在瀏覽器上進行響應
#region 異步返回文本(提高應用程序的吞吐能力) public async Task<ActionResult> AwaitHtml() { var responseHtml = await GetResponseHtml("//www.sina.com"); return Content(responseHtml); } private async Task<string> GetResponseHtml(string url) { return await GetResponseStringAsync(url); } private async Task<string> GetResponseStringAsync(string url) { var httpClient = new System.Net.Http.HttpClient(); var response = await httpClient.GetAsync(url); if (response.StatusCode == System.Net.HttpStatusCode.OK) { return await response.Content.ReadAsStringAsync();//加await的意思(si)是說,主UI等(deng)待它執行(xing)(xing)完成后(hou),再繼續執行(xing)(xing),這種就叫(jiao)作并行(xing)(xing)! } else { return null;//error } } #endregion
而(er)(er)在運(yun)(yun)(yun)行后,我(wo)們可以(yi)看到,它(ta)被正常的(de)(de)(de)輸(shu)出了,而(er)(er)在它(ta)運(yun)(yun)(yun)行的(de)(de)(de)背后,我(wo)們可能(neng)并(bing)不清楚,它(ta)實(shi)現上不是(shi)在WWW主線程(cheng)上運(yun)(yun)(yun)行的(de)(de)(de),而(er)(er)是(shi)異步開啟了新的(de)(de)(de)線程(cheng)來做(zuo)的(de)(de)(de)這事,這才是(shi)重要的(de)(de)(de),它(ta)這樣做(zuo)的(de)(de)(de)目的(de)(de)(de)只有一個,那就是(shi)搞高(gao)WWW的(de)(de)(de)響應(ying)能(neng)力,即提高(gao)它(ta)的(de)(de)(de)程(cheng)序(xu)的(de)(de)(de)吞吐(tu)量!