2013-02-08 86 views
5

如果我只是返回一個視圖,是否有性能差異從Task返回它?任務<ViewResult>和ViewResult之間的區別

[HttpGet] 
public Task<ViewResult> Index() 
{ 
    return Task.FromResult(View()); 
} 

[HttpGet] 
public ViewResult Index() 
{ 
    return View(); 
} 
+0

看到這個http://www.tugberkugurlu.com/archive/asynchronous-database-calls-with-task-based-asynchronous-programming-model-tap-in-asp-net-mvc-4與此http: //codeclimber.net.nz/archive/2012/01/09/evolution-of-async-controller-asp-net-mvc.aspx – 2013-02-08 14:07:03

回答

3

就你而言,Task版本可能會變慢,因爲你只是增加Task的開銷而沒有任何好處。如果您可以利用async - await,也就是說,如果您實際上正在執行一些可以在方法中異步執行的操作,則返回Task是有意義的。

1

異步操作不會比標準同步 動作執行任何速度更快;它只是允許更有效地使用服務器資源。一個 動作想要一次執行多個異步操作時,可以看到異步代碼最大好處的一個 。

從書這種方式被命名爲Professional ASP.NET MVC 4

也有關於這個話題的例子

public class PortalController : Controller { 
    public ActionResult Index(string city) { 
     NewsService newsService = new NewsService(); 
     WeatherService weatherService = new WeatherService(); 
     SportsService sportsService = new SportsService(); 
     PortalViewModel model = new PortalViewModel { 
      News = newsService.GetNews(city), 
      Weather = weatherService.GetWeather(city), 
      Sports = sportsService.GetScores(city) 
     }; 
     return View(model); 
    } 
} 

注意,調用順序執行,所以需要的時間來響應用戶等於進行每次單獨通話所需的時間總和。如果這些調用是200,300和400毫秒(ms),那麼總的動作執行時間是900ms(加上一些微不足道的開銷)。

類似地,該操作將採用以下形式的異步版本:

public class PortalController : Controller { 
    public async Task<ActionResult> Index(string city) { 
     NewsService newsService = new NewsService(); 
     WeatherService weatherService = new WeatherService(); 
     SportsService sportsService = new SportsService(); 
     var newsTask = newsService.GetNewsAsync(city); 
     var weatherTask = weatherService.GetWeatherAsync(city); 
     var sportsTask = sportsService.GetScoresAsync(city); 
     await Task.WhenAll(newsTask, weatherTask, sportsTask); 
     PortalViewModel model = new PortalViewModel { 
      News = newsTask.Result, 
      Weather = weatherTask.Result, 
      Sports = sportsTask.Result 
     }; 
     return View(model); 
    } 
} 

注意,在並行操作都踢掉,所以向用戶作出響應所需要的時間是 等於最長的個人通話時間。如果呼叫是200,300和400毫秒,那麼執行總時間爲400毫秒(加上一些微不足道的開銷)。