В чем разница между:
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?
Ответы:
Асинхронные действия полезны только тогда, когда вы выполняете связанные операции ввода-вывода, такие как вызовы удаленного сервера. Преимущество асинхронного вызова заключается в том, что во время операции ввода-вывода рабочий поток ASP.NET не используется. Итак, вот как работает первый пример:
IdentityManager.Authentication.CheckPasswordAndSignIn
метод. Это блокирующий вызов -> во время всего вызова рабочий поток подвергается опасности.А вот как работает второй вызов:
IdentityManager.Authentication.CheckPasswordAndSignInAsync
Называется , который немедленно возвращается. Порт завершения ввода-вывода регистрируется, и рабочий поток ASP.NET выпускается в пул потоков.Как видите, во втором случае рабочие потоки ASP.NET используются только в течение короткого периода времени. Это означает, что в пуле доступно больше потоков для обслуживания других запросов.
Итак, в заключение, используйте асинхронные действия только тогда, когда у вас есть настоящий асинхронный API внутри. Если вы делаете блокирующий вызов внутри асинхронного действия, вы убиваете все его преимущества.
источник
CheckPasswordAndSignInAsync
вызывается, ASP.NET берет другой поток из пула потоков и начинает его выполнение, не так ли? Если нет, то гдеchecking password procedure
выполняется?Обычно один HTTP-запрос обрабатывается одним потоком, полностью удаляя этот поток из пула до тех пор, пока не будет возвращен ответ. В случае TPL вы не связаны этим ограничением. Любой поступающий запрос запускает продолжение с каждой единицей вычислений, необходимой для вычисления ответа, который может выполняться в любом потоке в пуле. С помощью этой модели вы можете обрабатывать намного больше одновременных запросов, чем со стандартным ASP.Net.
Будет ли порождена какая-то новая задача, или нет, и нужно ли ее ждать или нет. Всегда думайте о тех 70 мс, что составляет прибл. макс. время, которое должен занять любой вызов метода. Если он длиннее, то ваш пользовательский интерфейс, скорее всего, не будет очень отзывчивым.
источник
В веб-приложениях, которые видят большое количество одновременных запросов при запуске или имеют скачкообразную нагрузку (когда параллелизм резко возрастает), выполнение этих вызовов веб-служб асинхронными повысит скорость отклика вашего приложения. Асинхронный запрос обрабатывается столько же, сколько и синхронный. Например, если запрос выполняет вызов веб-службы, для выполнения которого требуется две секунды, запрос занимает две секунды, независимо от того, выполняется он синхронно или асинхронно. Однако во время асинхронного вызова поток не блокируется от ответа на другие запросы, пока он ожидает завершения первого запроса. Следовательно, асинхронные запросы предотвращают создание очереди запросов и рост пула потоков, когда существует много одновременных запросов, которые вызывают длительные операции.
источник