Я работал над статьей об асинхронных методах контроллера в ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) и думаю, Я могу упустить момент.
Рассмотрим этот метод, который я написал, который очень похож на пример из статьи:
[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);
}
Как я понимаю, вот как все будет разворачиваться во время выполнения:
Поток ASP.NET будет создан для входящего HTTP-запроса.
Этот поток (предположительно выполнив некоторую необходимую предварительную работу) войдет в мой метод Index () выше.
Выполнение достигнет ключевого слова «await» и запустит процесс сбора данных в другом потоке.
Исходный поток «ASP.NET» вернется к коду, который вызвал мой метод-обработчик, с экземпляром класса Task в качестве возвращаемого значения.
Инфраструктурный код, который вызвал мой метод-обработчик, будет продолжать работать в исходном потоке «ASP.NET», пока не достигнет точки, где ему нужно будет использовать фактический объект ActionResult (например, для визуализации страницы).
Затем вызывающая сторона получит доступ к этому объекту с помощью члена Task.Result, который заставит его (т. Е. Поток «ASP.NET») ожидать поток, неявно созданный на шаге 3 выше.
Я не вижу, что это делает по сравнению с тем же, без await / async, за исключением двух вещей, которые я воспринимаю как пустяки:
Поток вызывающего и рабочий поток, созданные await, могут работать параллельно в течение некоторого промежутка времени (часть «до» в # 5 выше). Я догадываюсь, что период времени довольно мал. Когда инфраструктура вызывает метод контроллера, я думаю, что обычно требуется фактический ActionResult вызова контроллера, прежде чем он сможет сделать гораздо больше (если вообще что-то).
Существует некоторая полезная новая инфраструктура, связанная с таймаутом и отменой длительных асинхронных операций контроллера.
Предполагается, что целью добавления асинхронных методов контроллера является освобождение рабочих потоков ASP.NET для фактического ответа на HTTP-запросы. Эти темы являются конечным ресурсом. К сожалению, я не вижу, как шаблон, предложенный в статье, на самом деле служит для сохранения этих потоков. И даже если он это делает и каким-то образом снимает с себя нагрузку по обработке запроса в какой-то не-ASPP. Поток, что это делает? Могут ли потоки обрабатывать HTTP-запрос так сильно отличается от потоков в целом?
Execution will reach the "await" keyword and kick off a data acquisition process on another thread
-- Не обязательно.async
не требует другой темы ... Это продолжение. Это можно сделать, переупорядочив инструкции в том же потоке.