1. 程式人生 > >ASP.NET MVC4中的異步控制器

ASP.NET MVC4中的異步控制器

follow spa out 重要 .net 計數器 res mode 因此

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

public class PortalController : AsyncController 
{
     public Task<ViewResult> News( string city)     
     {
           return Task.Factory.StartNew(() =>  RunThread(city))
                .ContinueWith(t =>
                               {
                                       return View(new ViewStringModel()
                                                   {
                                                       Text = t.Result
                                                   });
                               });
     }

      private string  RunThread(string input)
      {
            Thread.Sleep(5000);
            return input;
      }
 }

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

public Task<ViewResult> News(string city) {
     return Task.Factory.StartNew(() => RunThread(city))
         .ContinueWith(t => View(new  ViewStringModel{ Text = t.Result }));
 }

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

偉大的async/await

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

public class PortalController : AsyncController {
     public async Task<ViewResult> News(string city)
     {
            return View(new  ViewStringModel()
                         {                             
                                  Text = await NewThread(city)
                         });
     }      

     private async Task<string> NewThread(string input)    
     {         
            Thread.Sleep(5000);         
            return input; 
     } 
 }

總結

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

ASP.NET MVC4中的異步控制器