2013-02-08 2 views
5

Wenn ich nur eine Ansicht zurückgebe, gibt es Leistungsunterschied, um es von Aufgabe zurückzugeben?Unterschied zwischen Aufgabe <ViewResult> und ViewResult

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

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

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

Antwort

3

In Ihrem Fall wird die Task Version wahrscheinlich langsamer sein, weil Sie einfach Overhead von Task ohne Nutzen hinzufügen. Die Rückgabe eines Task macht Sinn, wenn Sie async - await nutzen können, das heißt, wenn Sie tatsächlich eine Aktion ausführen, die in Ihrer Methode asynchron durchgeführt werden kann.

1

Asynchrone Aktion ausführen nicht schneller als ein Standard-Synchron Aktion; Es ermöglicht nur eine effizientere Nutzung von Serverressourcen. Ein der größten Vorteile von asynchronem Code kann gesehen werden, wenn eine Aktion mehrere asynchrone Operationen gleichzeitig ausführen möchte.

diese Informationen von Buch, die Professional ASP.NET MVC 4

auch genannt wird, gibt es ein Beispiel zu diesem Thema

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

Beachten Sie, dass die Anrufe nacheinander durchgeführt werden, so dass die Zeit für den Benutzer zu reagieren, erforderlich ist gleich der Summe der Zeiten, die für jeden einzelnen Anruf benötigt werden. Wenn die Aufrufe 200, 300 und 400 Millisekunden (ms) betragen, beträgt die Gesamtaktionsausführungszeit 900 ms (zuzüglich eines geringfügigen Overheads).

In ähnlicher Weise eine asynchrone Version dieser Aktion würde die folgende Form:

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

Beachten Sie, dass die Operationen werden alle parallel getreten, so die Zeit, um den Benutzer zu reagieren, erforderlich ist gleich der längste individuelle Anrufzeit. Wenn die Aufrufe 200, 300 und 400 ms sind, beträgt die Gesamtaktion Ausführungszeit 400 ms (zuzüglich eines geringfügigen Overheads).