日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
從ASP.NET MVC 2到4看異步控制器

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

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、長葛網(wǎng)絡(luò)推廣、小程序定制開發(fā)、長葛網(wǎng)絡(luò)營銷、長葛企業(yè)策劃、長葛品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供長葛建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

異步控制器

在MS越來越提倡異步操作的時(shí)代, ASP.NET MVC中的異步操作卻一直顯得比較落伍, 對(duì)于開發(fā)人員來說, 實(shí)現(xiàn)一個(gè)異步控制器往往要比普通的控制器花費(fèi)更多的代碼. 這個(gè)特性是在ASP.NET MVC 2中被引入的, 之后就沒怎么改過,直到現(xiàn)在, 隨著C# 5和 async/await的即將到來, 異步控制器現(xiàn)在已經(jīng)跟普通的控制器操作代碼一樣的簡(jiǎn)練啦. 現(xiàn)在(當(dāng)然得等ASP.NET MVC4,.NET 4.5和C# 5正式的發(fā)布之后), 你可以寫出下面這樣簡(jiǎn)潔的代碼啦:

 
 
 
  1.   publicasync Task FooBar() {  
  2. returnView(await DoSomething("Some Action"));} 

怎樣? 真的是很簡(jiǎn)單的吧~~

展望固然重要, 不過在這之前, 也請(qǐng)大家隨著我來回顧下一步控制器在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上搬過來一個(gè)例子吧.

要看異步控制器, 我們首先看看同樣功能的同步實(shí)現(xiàn), 大家應(yīng)該都很熟悉了:

 
 
 
  1. publicclassPortalController: Controller{publicActionResult News(stringcity){  
  2. NewsService newsService = newNewsService();  
  3. ViewStringModel headlines = newsService.GetHeadlines(city);  
  4. returnView(headlines);}  

我們?cè)賮砜雌洚惒綄?shí)現(xiàn)方式:

 
 
 
  1. publicclassPortalController : AsyncController{  
  2. publicvoidNewsAsync(stringcity){  
  3. AsyncManager.OutstandingOperations.Increment();  
  4. var newsService = newNewsService();  
  5. newsService.GetHeadlinesCompleted += (sender, e) =>{AsyncManager.Parameters["headlines"] = e.Value;AsyncManager.OutstandingOperations.Decrement();};  
  6. newsService.GetHeadlinesAsync(city);  
  7. }  
  8. publicActionResult NewsCompleted(string[] headlines){  
  9. returnView("News", newViewStringModel{NewsHeadlines = headlines});}  
  10. }  

看看上面的實(shí)現(xiàn), 不得不承認(rèn), 相對(duì)同步控制器, 異步Action開發(fā)人員要做的工作還是要多一些的. 但在.NET4.0的大環(huán)境中, 我們也只能用這種方式來實(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中,微軟帶來了Task類, 感興趣的同學(xué)可以猛擊這里. 有了Task,如果你只是想簡(jiǎn)單的一個(gè)函數(shù)里面做異步操作也是可以滴:

 
 
 
  1.   publicclassPortalController : AsyncController {publicvoidNewsAsync(stringcity)
  2. {AsyncManager.OutstandingOperations.Increment();  
  3. var task = Task.Factory.StartNew(() => RunThread(city));  
  4. task.ContinueWith(t =>{AsyncManager.Parameters["headlines"] = t.Result;  
  5. AsyncManager.OutstandingOperations.Decrement();})  
  6. ;}  
  7.   publicActionResult NewsCompleted(string[] headlines){  
  8. returnView("News", newViewStringModel{NewsHeadlines = headlines});}  
  9.   privatestringRunThread(stringinput){  
  10. Thread.Sleep(5000);returninput;}} 

當(dāng)然, 代碼并沒有減少太多, 不過也算是一種不太復(fù)雜的實(shí)現(xiàn), 雖然沒那么好看, 但也不至于太難看.

下面我們?cè)賮砜纯碅SP.NET MVC 4中的異步控制器吧.

ASP.NET 4 Developer preview中的異步控制器

在拋棄了對(duì).NET 3的支持之后, ASP.NET MVC 4 徹底擁抱了Task類庫, 你不需要再蛋疼的給每個(gè)Action寫兩個(gè)方法, 也無需傻傻的手動(dòng)對(duì)異步Action計(jì)數(shù)器增減了(AsyncManager.OutstandingOperations.Increment()), 現(xiàn)在的你只需拿起手指, 輕輕敲幾下, 其他的事情都由系統(tǒng)幫你完成.

 
 
 
  1. publicclassPortalController : AsyncController {  
  2. publicTask News( stringcity) {  
  3. returnTask.Factory.StartNew(() => RunThread(city)).ContinueWith(t => {  
  4. returnView(newViewStringModel(){Text = t.Result});  
  5. });}  
  6. privatestringRunThread(stringinput){  
  7. Thread.Sleep(5000);  
  8. returninput;}  

是不是好多了?Lamda可以讓一切更爽:

 
 
 
  1. publicTask News(stringcity) {  
  2. returnTask.Factory.StartNew(() => RunThread(city)).ContinueWith(t => View(newViewStringModel{   
  3. Text = t.Result }));  

那么, 是不是到這里就要說再見了呢? 不是的, 請(qǐng)繼續(xù)往下看.

偉大的async/await

雖然還未到正式發(fā)布的時(shí)候, 不過如果我們跟著微軟的目光往前更進(jìn)一步, 在ASP.NET和C# 5中, 或者我們從這里可以給.NET 4增加Async 的功能, 在有了async和await這兩個(gè)關(guān)鍵詞之后, 異步編碼就更簡(jiǎn)單啦, 這其中也包括異步控制器的相關(guān)操作:

 
 
 
  1. publicclassPortalController : AsyncController {  
  2. publicasyncTask News(string city)  
  3. {returnView(newViewStringModel(){   
  4. Text = awaitNewThread(city)});}   
  5. privateasync TaskNewThread(stringinput)   
  6. { Thread.Sleep(5000);   
  7. returninput; }} 

總結(jié)

由于有了async和await關(guān)鍵字以及Task類庫的幫助, 在可預(yù)見的未來里, 我們操作異步控制器就可以像操作普通的控制器一樣了, 但就像其他的眾多新增的.NET特性一樣, 能力越大, 責(zé)任也就越大, 方便也往往意味著濫用. 異步控制器固然好, 但也并非每種場(chǎng)合都適合用它, 不恰當(dāng)?shù)氖褂盟鶗?huì)導(dǎo)致服務(wù)器需要在不同的線程之間切換, 而這也帶來了更多額外的開銷. 在開發(fā)領(lǐng)域, 我們尤其要注意性能往往比其他任何東西都重要, 因此, 請(qǐng)?jiān)诖_實(shí)能提高性能和用戶相應(yīng)的情況下使用異步控制器.


當(dāng)前文章:從ASP.NET MVC 2到4看異步控制器
文章分享:http://www.5511xx.com/article/coepsgg.html