Я працював над статтею про асинхронні методи контролера в ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-action-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);
}
Як я розумію, саме так розгортаються речі під час виконання:
Для вхідного запиту HTTP буде створений потік ASP.NET.
Цей потік (імовірно, виконавши якусь необхідну попередню роботу) введе мій метод Index () вище.
Виконання досягне ключового слова "очікувати" і розпочнеть процес збору даних на іншому потоці.
Оригінальний потік "ASP.NET" повернеться до коду, який називається моїм методом обробника, із екземпляром класу Task як поверненим значенням.
Інфраструктурний код, який викликав метод мого обробника, буде продовжувати працювати на оригінальній потоці "ASP.NET" до тих пір, поки не досягне точки, коли йому потрібно використовувати фактичний об'єкт ActionResult (наприклад, для візуалізації сторінки).
Потім абонент отримає доступ до цього об’єкта за допомогою члена Task.Result, що змусить його (тобто потоку "ASP.NET") чекати потоку, створеного неявно на кроці №3 вище.
Я не бачу, що це досягає порівняно з тим самим, що не чекає / асинхронізує, за винятком двох речей, які я сприймаю як дрібницю:
Потік виклику та робочий потік, створений програмою await, можуть працювати паралельно протягом певного періоду часу (частина "до" №5 вище). Моя думка, що проміжок часу досить малий. Коли інфраструктура викликає метод контролера, я думаю, що він, як правило, потребує фактичного ActionResult виклику контролера, перш ніж він може зробити набагато більше (якщо що-небудь) більше.
Існує нова корисна нова інфраструктура, пов’язана з тимчасовим очікуванням та скасуванням тривалих операцій асинхронного контролера.
Мета додавання методів контролера async - це нібито звільнити ці робочі потоки ASP.NET, щоб реально відповідати на HTTP-запити. Ці нитки є кінцевим ресурсом. На жаль, я не бачу, як шаблон, запропонований у статті, насправді служить для збереження цих ниток. І навіть якщо це відбувається, і якимось чином вивантажує тягар обробки запиту на якусь нитку, яка не є ASP.NET, що це досягає? Чи потоки, які, здається, здатні обробляти HTTP-запит, сильно відрізняються від потоків взагалі?
Execution will reach the "await" keyword and kick off a data acquisition process on another thread
-- Не обов'язково.async
не вимагає іншої нитки ... Це продовження. Це можна досягти шляхом переупорядкування інструкцій на одній нитці.