2013-02-08 23 views
5

Nếu tôi chỉ trả về một chế độ xem, có sự khác biệt về hiệu suất để trả lại từ Task không?Sự khác biệt giữa nhiệm vụ <ViewResult> và ViewResult

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

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

xem http://www.tugberkugurlu.com/archive/asynchronous-database-calls-with-task-based-asynchronous-programming-model-tap-in-asp-net-mvc-4 và http: //codeclimber.net.nz/archive/2012/01/09/evolution-of-async-controller-asp-net-mvc.aspx –

Trả lời

3

Trong trường hợp của bạn, phiên bản Task có thể chậm hơn, vì bạn chỉ cần thêm phí trên Task mà không có lợi ích. Trả lại Task có ý nghĩa khi bạn có thể tận dụng lợi thế của async - await, nghĩa là, nếu bạn thực sự thực hiện một số hành động có thể được thực hiện không đồng bộ trong phương pháp của bạn.

1

hành động không đồng bộ sẽ không thực hiện bất kỳ nhanh hơn so với một đồng bộ hành động tiêu chuẩn; nó chỉ cho phép sử dụng tài nguyên máy chủ hiệu quả hơn. Một những lợi ích lớn nhất của mã không đồng bộ có thể được nhìn thấy khi hành động muốn thực hiện một số thao tác không đồng bộ cùng một lúc.

thông tin này từ cuốn sách đó được đặt tên Professional ASP.NET MVC 4

Cũng có một ví dụ về chủ đề này

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); 
    } 
} 

Lưu ý rằng các cuộc gọi được thực hiện tuần tự, vì vậy thời gian cần thiết để đáp ứng cho người sử dụng bằng tổng số lần cần thiết để thực hiện từng cuộc gọi riêng lẻ. Nếu các cuộc gọi là 200, 300 và 400 mili giây (ms), thì tổng thời gian thực hiện hành động là 900 mili giây (cộng với một số chi phí không thể chỉnh sửa).

Tương tự như vậy, một phiên bản không đồng bộ của hành động đó sẽ mang hình thức sau:

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); 
    } 
} 

Lưu ý rằng các hoạt động đều được khởi công vào song song, vì vậy thời gian cần thiết để đáp ứng cho người sử dụng là bằng với thời gian gọi cá nhân dài nhất. Nếu các cuộc gọi là 200, 300, và 400 ms, thì tổng số hành động thời gian thực hiện là 400 ms (cộng với một số chi phí không thể nhận được).

Các vấn đề liên quan