成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從ASP.NET MVC 2到4看異步控制器

開發 后端
要看異步控制器, 我們首先看看同樣功能的同步實現, 大家應該都很熟悉了。這篇文章主要針對即將到來的ASP.NET MVC4中的異步控制器做一個回顧和展望, 并未涉及到討論異步控制器的使用場合。

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

  異步控制器

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

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

  怎樣? 真的是很簡單的吧~~

  展望固然重要, 不過在這之前, 也請大家隨著我來回顧下一步控制器在ASP.NET MVC 2到4中的實現, 對比往往更能讓人印象深刻.

  注意:下面關于ASP.NET MVC 4的例子都是基于ASP.NET MVC Developer Preview. 在正式版中, 這種實現可能會有所變化.

  在ASP.NET MVC 2/3中的異步控制器

  在ASP.NET MVC 2/3 中, 要實現一個一步控制器,你將不得不實現兩個方法, 一個叫XXXAsync, 另外一個叫XXXCompleted, 同時你的控制器還要改成繼承自AsyncController, 關于這個的實現和講解已經有很多現成的例子, 這里我就直接從MSDN上搬過來一個例子吧.

  要看異步控制器, 我們首先看看同樣功能的同步實現, 大家應該都很熟悉了:

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

  我們再來看其異步實現方式:

  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. }  

  看看上面的實現, 不得不承認, 相對同步控制器, 異步Action開發人員要做的工作還是要多一些的. 但在.NET4.0的大環境中, 我們也只能用這種方式來實現了.

  當然, MSDN的例子是標準的分層的實現例子, 在這個例子中,你將不得不實現自己的Service層, 如果你只是想簡單的調用異步Action, 有沒有方便的辦法呢? 答案是有的, 在.NET 4.0中,微軟帶來了Task類, 感興趣的同學可以猛擊這里. 有了Task,如果你只是想簡單的一個函數里面做異步操作也是可以滴:

 

  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;}} 

 

  當然, 代碼并沒有減少太多, 不過也算是一種不太復雜的實現, 雖然沒那么好看, 但也不至于太難看.

  下面我們再來看看ASP.NET MVC 4中的異步控制器吧.

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

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

 

  1. publicclassPortalController : AsyncController {  
  2. publicTask<ViewResult> 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<ViewResult> News(stringcity) {  
  2. returnTask.Factory.StartNew(() => RunThread(city)).ContinueWith(t => View(newViewStringModel{   
  3. Text = t.Result }));  

  那么, 是不是到這里就要說再見了呢? 不是的, 請繼續往下看.

  偉大的async/await

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

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

  總結

  由于有了async和await關鍵字以及Task類庫的幫助, 在可預見的未來里, 我們操作異步控制器就可以像操作普通的控制器一樣了, 但就像其他的眾多新增的.NET特性一樣, 能力越大, 責任也就越大, 方便也往往意味著濫用. 異步控制器固然好, 但也并非每種場合都適合用它, 不恰當的使用它往往會導致服務器需要在不同的線程之間切換, 而這也帶來了更多額外的開銷. 在開發領域, 我們尤其要注意性能往往比其他任何東西都重要, 因此, 請在確實能提高性能和用戶相應的情況下使用異步控制器.

原文鏈接:http://www.cnblogs.com/jujusharp/archive/2012/02/02/async-controller-from-net-mvc-2-to-4.html

【編輯推薦】

  1. ASP.NET MVC會成為ASP.NET未來主流的UI平臺?
  2. ASP.NET性能優化之構建自定義文件緩存
  3. 想愛容易相處難:當ASP.NET MVC愛上IoC
  4. 導致ASP.NET站點重啟的十大原因
  5. 淺談ASP.NET核心對象
責任編輯:彭凡 來源: 博客園
相關推薦

2009-01-12 11:16:58

控制器控制器行為行為結果

2011-08-08 10:46:15

ASP.NET MVC

2009-07-22 10:13:31

異步ActionASP.NET MVC

2009-07-22 16:34:36

使用T4ASP.NET MVC

2021-10-19 10:42:00

MVCAPI.NET

2009-07-24 13:20:44

MVC框架ASP.NET

2012-07-04 14:49:34

ASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-02-16 10:05:11

ActionMVCASP.NET

2009-03-06 10:28:30

MVCASP.NET異步Action

2009-02-17 09:22:14

ActionMVCASP.NET

2009-12-18 09:13:31

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2010-02-05 08:32:32

ASP.NET MVC

2011-09-28 13:48:06

Visual Stud

2009-07-28 16:40:11

ASP.NET異步頁面
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色毛片在线观看 | 日韩一区精品 | 国产一级一级毛片 | 国产欧美一区二区三区在线看 | 亚洲一区二区av | 国产精品成人一区二区三区吃奶 | 在线亚洲人成电影网站色www | 国产91久久精品一区二区 | av在线免费观看不卡 | 我我色综合 | 精品av| 亚洲电影免费 | 国产精品一区二区在线免费观看 | 在线一区视频 | 日韩a| 久久小视频 | 国产精品五区 | 男女羞羞视频在线观看 | 亚洲精品在线播放 | 天天射网站 | 成人免费在线观看视频 | 国产精品国产精品国产专区不蜜 | 欧美在线高清 | 中文字幕在线精品 | 成人在线a | 国产中文字幕网 | 日韩免费 | 亚洲va国产日韩欧美精品色婷婷 | 国产丝袜一区二区三区免费视频 | 91麻豆精品国产91久久久久久久久 | 久久久久久久久久久久久久久久久久久久 | 色99视频 | 欧美一区日韩一区 | 国产精品夜夜夜一区二区三区尤 | 97久久久| 国产成人精品免费视频大全最热 | 中文字幕在线一区 | 国产精品久久亚洲 | 欧洲成人免费视频 | 国产高清视频 | 久久国产综合 |