新聞中心
這篇文章主要針對(duì)即將到來(lái)的ASP.NET MVC4中的異步控制器做一個(gè)回顧和展望, 并未涉及到討論異步控制器的使用場(chǎng)合, 如果對(duì)異步控制器何時(shí)使用仍然糾結(jié)的同學(xué), 這次可能會(huì)讓你們失望了, 不過(guò)關(guān)于這方面的討論和分析其實(shí)蠻多的, 大家也可以自行搜索.好了,廢話少說(shuō),上正文.

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、長(zhǎng)葛網(wǎng)絡(luò)推廣、小程序定制開發(fā)、長(zhǎng)葛網(wǎng)絡(luò)營(yíng)銷、長(zhǎng)葛企業(yè)策劃、長(zhǎng)葛品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供長(zhǎng)葛建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
異步控制器
在MS越來(lái)越提倡異步操作的時(shí)代, ASP.NET MVC中的異步操作卻一直顯得比較落伍, 對(duì)于開發(fā)人員來(lái)說(shuō), 實(shí)現(xiàn)一個(gè)異步控制器往往要比普通的控制器花費(fèi)更多的代碼. 這個(gè)特性是在ASP.NET MVC 2中被引入的, 之后就沒怎么改過(guò),直到現(xiàn)在, 隨著C# 5和 async/await的即將到來(lái), 異步控制器現(xiàn)在已經(jīng)跟普通的控制器操作代碼一樣的簡(jiǎn)練啦. 現(xiàn)在(當(dāng)然得等ASP.NET MVC4,.NET 4.5和C# 5正式的發(fā)布之后), 你可以寫出下面這樣簡(jiǎn)潔的代碼啦:
- publicasync Task
FooBar() { - returnView(await DoSomething("Some Action"));}
怎樣? 真的是很簡(jiǎn)單的吧~~
展望固然重要, 不過(guò)在這之前, 也請(qǐng)大家隨著我來(lái)回顧下一步控制器在ASP.NET MVC 2到4中的實(shí)現(xiàn), 對(duì)比往往更能讓人印象深刻.
注意:下面關(guān)于ASP.NET MVC 4的例子都是基于ASP.NET MVC Developer Preview. 在正式版中, 這種實(shí)現(xiàn)可能會(huì)有所變化.
在ASP.NET MVC 2/3中的異步控制器
在ASP.NET MVC 2/3 中, 要實(shí)現(xiàn)一個(gè)一步控制器,你將不得不實(shí)現(xiàn)兩個(gè)方法, 一個(gè)叫XXXAsync, 另外一個(gè)叫XXXCompleted, 同時(shí)你的控制器還要改成繼承自AsyncController, 關(guān)于這個(gè)的實(shí)現(xiàn)和講解已經(jīng)有很多現(xiàn)成的例子, 這里我就直接從MSDN上搬過(guò)來(lái)一個(gè)例子吧.
要看異步控制器, 我們首先看看同樣功能的同步實(shí)現(xiàn), 大家應(yīng)該都很熟悉了:
- publicclassPortalController: Controller{publicActionResult News(stringcity){
- NewsService newsService = newNewsService();
- ViewStringModel headlines = newsService.GetHeadlines(city);
- returnView(headlines);}
- }
我們?cè)賮?lái)看其異步實(shí)現(xiàn)方式:
- publicclassPortalController : AsyncController{
- publicvoidNewsAsync(stringcity){
- AsyncManager.OutstandingOperations.Increment();
- var newsService = newNewsService();
- newsService.GetHeadlinesCompleted += (sender, e) =>{AsyncManager.Parameters["headlines"] = e.Value;AsyncManager.OutstandingOperations.Decrement();};
- newsService.GetHeadlinesAsync(city);
- }
- publicActionResult NewsCompleted(string[] headlines){
- returnView("News", newViewStringModel{NewsHeadlines = headlines});}
- }
看看上面的實(shí)現(xiàn), 不得不承認(rèn), 相對(duì)同步控制器, 異步Action開發(fā)人員要做的工作還是要多一些的. 但在.NET4.0的大環(huán)境中, 我們也只能用這種方式來(lái)實(shí)現(xiàn)了.
當(dāng)然, MSDN的例子是標(biāo)準(zhǔn)的分層的實(shí)現(xiàn)例子, 在這個(gè)例子中,你將不得不實(shí)現(xiàn)自己的Service層, 如果你只是想簡(jiǎn)單的調(diào)用異步Action, 有沒有方便的辦法呢? 答案是有的, 在.NET 4.0中,微軟帶來(lái)了Task類, 感興趣的同學(xué)可以猛擊這里. 有了Task,如果你只是想簡(jiǎn)單的一個(gè)函數(shù)里面做異步操作也是可以滴:
- publicclassPortalController : AsyncController {publicvoidNewsAsync(stringcity)
- {AsyncManager.OutstandingOperations.Increment();
- var task = Task.Factory.StartNew(() => RunThread(city));
- task.ContinueWith(t =>{AsyncManager.Parameters["headlines"] = t.Result;
- AsyncManager.OutstandingOperations.Decrement();})
- ;}
- publicActionResult NewsCompleted(string[] headlines){
- returnView("News", newViewStringModel{NewsHeadlines = headlines});}
- privatestringRunThread(stringinput){
- Thread.Sleep(5000);returninput;}}
當(dāng)然, 代碼并沒有減少太多, 不過(guò)也算是一種不太復(fù)雜的實(shí)現(xiàn), 雖然沒那么好看, 但也不至于太難看.
下面我們?cè)賮?lái)看看ASP.NET MVC 4中的異步控制器吧.
ASP.NET 4 Developer preview中的異步控制器
在拋棄了對(duì).NET 3的支持之后, ASP.NET MVC 4 徹底擁抱了Task類庫(kù), 你不需要再蛋疼的給每個(gè)Action寫兩個(gè)方法, 也無(wú)需傻傻的手動(dòng)對(duì)異步Action計(jì)數(shù)器增減了(AsyncManager.OutstandingOperations.Increment()), 現(xiàn)在的你只需拿起手指, 輕輕敲幾下, 其他的事情都由系統(tǒng)幫你完成.
- publicclassPortalController : AsyncController {
- publicTask
News( stringcity) { - returnTask.Factory.StartNew(() => RunThread(city)).ContinueWith(t => {
- returnView(newViewStringModel(){Text = t.Result});
- });}
- privatestringRunThread(stringinput){
- Thread.Sleep(5000);
- returninput;}
- }
是不是好多了?Lamda可以讓一切更爽:
- publicTask
News(stringcity) { - returnTask.Factory.StartNew(() => RunThread(city)).ContinueWith(t => View(newViewStringModel{
- Text = t.Result }));
- }
那么, 是不是到這里就要說(shuō)再見了呢? 不是的, 請(qǐng)繼續(xù)往下看.
偉大的async/await
雖然還未到正式發(fā)布的時(shí)候, 不過(guò)如果我們跟著微軟的目光往前更進(jìn)一步, 在ASP.NET和C# 5中, 或者我們從這里可以給.NET 4增加Async 的功能, 在有了async和await這兩個(gè)關(guān)鍵詞之后, 異步編碼就更簡(jiǎn)單啦, 這其中也包括異步控制器的相關(guān)操作:
- publicclassPortalController : AsyncController {
- publicasyncTask
News(string city) - {returnView(newViewStringModel(){
- Text = awaitNewThread(city)});}
- privateasync Task
NewThread(stringinput) - { Thread.Sleep(5000);
- returninput; }}
總結(jié)
由于有了async和await關(guān)鍵字以及Task類庫(kù)的幫助, 在可預(yù)見的未來(lái)里, 我們操作異步控制器就可以像操作普通的控制器一樣了, 但就像其他的眾多新增的.NET特性一樣, 能力越大, 責(zé)任也就越大, 方便也往往意味著濫用. 異步控制器固然好, 但也并非每種場(chǎng)合都適合用它, 不恰當(dāng)?shù)氖褂盟鶗?huì)導(dǎo)致服務(wù)器需要在不同的線程之間切換, 而這也帶來(lái)了更多額外的開銷. 在開發(fā)領(lǐng)域, 我們尤其要注意性能往往比其他任何東西都重要, 因此, 請(qǐng)?jiān)诖_實(shí)能提高性能和用戶相應(yīng)的情況下使用異步控制器.
分享文章:從ASP.NET MVC 2到4看異步控制器
轉(zhuǎn)載來(lái)源:http://m.fisionsoft.com.cn/article/coepsgg.html


咨詢
建站咨詢
