Подтвердить что ты не робот

В чем преимущество использования async с MVC5?

В чем разница между:

public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

и

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

Я вижу, что код MVC теперь имеет асинхронный режим, но в чем разница. Отличается ли производительность лучше, чем другая? Легче ли отлаживать проблемы друг с другом? Должен ли я вносить изменения в другие контроллеры для моего приложения, чтобы добавить Async?

4b9b3361

Ответ 1

Асинхронные действия полезны только при выполнении связанных с I/O операций, таких как удаленные вызовы сервера. Преимущество асинхронного вызова заключается в том, что во время операции ввода-вывода не используется рабочий поток ASP.NET. Итак, вот как работает первый пример:

  • Когда запрос попадает в действие, ASP.NET берет поток из пула потоков и начинает его выполнять.
  • Вызывается метод IdentityManager.Authentication.CheckPasswordAndSignIn. Это блокирующий вызов → в течение всего вызова, который подвергается рабочему потоку.

И вот как работает второй вызов:

  • Когда запрос попадает в действие, ASP.NET берет поток из пула потоков и начинает его выполнять.
  • Вызывается IdentityManager.Authentication.CheckPasswordAndSignInAsync, который немедленно возвращается. Порт завершения ввода-вывода зарегистрирован, и рабочий поток ASP.NET выпущен в пул потоков.
  • Позже, когда операция завершается, порт завершения ввода/вывода сигнализируется, другой поток вытягивается из пула потоков, чтобы закончить возврат представления.

Как вы можете видеть во втором случае рабочие потоки ASP.NET используются только в течение короткого периода времени. Это означает, что в пуле доступно больше потоков для обслуживания других запросов.

Таким образом, используйте асинхронные действия только в том случае, если внутри вы используете истинный асинхронный API. Если вы сделаете блокирующий вызов внутри асинхронного действия, вы полностью уничтожаете его.

Ответ 2

Обычно один HTTP-запрос обрабатывается одним потоком, полностью удаляя этот поток из пула, пока не будет возвращен ответ. С помощью TPL вы не связаны этим ограничением. Любой запрос, который приходит, запускает продолжение с каждой единицей вычисления, необходимой для вычисления ответа, который может выполняться в любом потоке в пуле. С помощью этой модели вы можете обрабатывать множество одновременных запросов, чем со стандартным ASP.Net.

Если это какая-то новая задача, которая будет порождена или нет, и если ее нужно ждать или нет. Всегда думайте о тех 70 мс, которые прибл. макс. время, которое должен принимать любой вызов метода. Если его дольше, то ваш пользовательский интерфейс, скорее всего, не будет чувствовать себя очень отзывчивым.

Ответ 3

В веб-приложениях, которые видят большое количество одновременных запросов при запуске или имеют пакетную нагрузку (где concurrency увеличивается внезапно), делает эти авизонные вызовы веб-сервисов повышающими отзывчивость вашего приложения. Асинхронный запрос обрабатывает столько же времени, сколько и синхронный запрос. Например, если запрос вызывает вызов веб-службы, для завершения которого требуется две секунды, запрос занимает две секунды, независимо от того, выполняется ли оно синхронно или асинхронно. Однако во время асинхронного вызова поток не блокируется от ответа на другие запросы, пока он ожидает завершения первого запроса. Поэтому асинхронные запросы предотвращают очередь запросов и рост пула потоков, когда существует много параллельных запросов, которые вызывают длительные операции.