任务<viewresult>和ViewResult </viewresult>之间的区别

时间:2013-02-08 13:40:18

标签: c# asp.net-mvc async-await

如果我只是返回一个视图,那么从Task返回它会有性能差异吗?

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

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

2 个答案:

答案 0 :(得分:3)

在您的情况下,Task版本可能会变慢,因为您只是增加Task的开销而没有任何好处。当您可以利用Task - async时,返回await是有意义的,也就是说,如果您实际执行的某些操作可以在您的方法中异步。

答案 1 :(得分:1)

  

异步操作的执行速度不会超过标准同步   行动;它只是允许更有效地使用服务器资源。一   当a时,可以看到异步代码的最大好处   action希望一次执行几个异步操作。

来自名为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毫秒(加上一些无法忽略的开销)。