Pracowałem nad artykułem na temat metod kontrolera asynchronicznego w ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) i myślę, że Mogę nie rozumieć o co chodzi.
Rozważ tę metodę, którą napisałem, która jest bardzo podobna do przykładu z artykułu:
[HttpGet]
[AsyncTimeout(8000)]
[HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")]
public async Task<ActionResult> Index(CancellationToken cancellationToken)
{
WidgetPageViewModel model = new WidgetPageViewModel()
{
toAdd = new Widget()
};
model.all = await _repo.GetAllAsync(cancellationToken);
return View(model);
}
Jak rozumiem, w ten sposób rzeczy będą się rozwijać w czasie wykonywania:
Wątek ASP.NET zostanie utworzony dla przychodzącego żądania HTTP.
Wątek ten (prawdopodobnie wykonując niezbędne prace wstępne) wprowadzi moją metodę Index () powyżej.
Wykonanie osiągnie słowo kluczowe „Oczekiwanie” i rozpocznie proces akwizycji danych w innym wątku.
Oryginalny wątek „ASP.NET” powróci do kodu, który wywołał moją metodę obsługi, z instancją klasy Task jako wartością zwracaną.
Kod infrastruktury, który wywołał moją metodę obsługi, będzie kontynuował działanie w oryginalnym wątku „ASP.NET”, dopóki nie osiągnie punktu, w którym będzie musiał użyć rzeczywistego obiektu ActionResult (np. Do renderowania strony).
Wywołujący uzyska następnie dostęp do tego obiektu za pomocą elementu Task.Result, co spowoduje, że (tj. Wątek „ASP.NET”) zaczeka na wątek utworzony pośrednio w kroku 3 powyżej.
Nie widzę, co to osiąga w porównaniu do tej samej rzeczy bez oczekiwania / asynchronizacji, z wyjątkiem dwóch rzeczy, które postrzegam jako drobne:
Wątek wywołujący i wątek roboczy utworzony przez Oczekuj mogą działać równolegle przez pewien okres czasu (część „do” w punkcie 5 powyżej). Mam przeczucie, że okres czasu jest dość krótki. Kiedy infrastruktura wywołuje metodę kontrolera, myślę, że generalnie potrzebuje rzeczywistego ActionResult wywołania kontrolera, zanim będzie w stanie zrobić więcej (jeśli cokolwiek) więcej.
Istnieje pewna nowa pomocna infrastruktura związana z przekroczeniem limitu czasu i anulowaniem długotrwałych operacji kontrolera asynchronicznego.
Dodanie metod kontrolera asynchronicznego ma na celu zwolnienie wątków roboczych ASP.NET w celu rzeczywistego odpowiadania na żądania HTTP. Te wątki są ograniczonym zasobem. Niestety nie widzę, jak wzorzec sugerowany w tym artykule faktycznie służy do zachowania tych wątków. A nawet jeśli tak, i w jakiś sposób odciąża obsługę żądania do wątku innego niż ASP.NET, co to osiąga? Czy wątki, które są w stanie obsłużyć żądanie HTTP, znacznie różnią się od wątków w ogóle?
Execution will reach the "await" keyword and kick off a data acquisition process on another thread
-- Niekoniecznie.async
nie wymaga kolejnego wątku ... To kontynuacja. Można tego dokonać, zmieniając instrukcje w tym samym wątku.