【问题标题】:Difference Between Task<ViewResult> and ViewResultTask<ViewResult> 和 ViewResult 之间的区别
【发布时间】:2013-01-24 07:03:12
【问题描述】:

如果我只是返回一个视图,从任务返回它是否存在性能差异?

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    异步操作的执行速度不会比标准同步操作快 行动;它只是允许更有效地使用服务器资源。一 异步代码的最大好处可以在当一个 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 毫秒(加上一些微不足道的开销)。

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 2012-01-24
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多