如果我只是返回一个视图,从任务返回它是否存在性能差异?
[HttpGet]
public Task<ViewResult> Index()
{
return Task.FromResult(View());
}
[HttpGet]
public ViewResult Index()
{
return View();
}
如果我只是返回一个视图,从任务返回它是否存在性能差异?
[HttpGet]
public Task<ViewResult> Index()
{
return Task.FromResult(View());
}
[HttpGet]
public ViewResult Index()
{
return View();
}
在您的情况下,该Task
版本可能会更慢,因为您只是增加了开销而Task
没有任何好处。Task
当您可以利用async
-时,返回 a是有意义的await
,也就是说,如果您实际上正在执行一些可以在您的方法中异步执行的操作。
异步操作的执行速度不会比标准同步操作快;它只是允许更有效地使用服务器资源。当一个动作想要一次执行多个异步操作时,可以看到异步代码的最大好处之一。
此信息来自名为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),那么总的操作执行时间是 900 毫秒(加上一些微不足道的开销)。
同样,该操作的异步版本将采用以下形式:
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 毫秒(加上一些微不足道的开销)。