Какая польза от использования ждут при вызове базы данных async
Я просто смотрю проект MVC5 по умолчанию и как он использует async в контроллерах.
Я хотел бы узнать, какое преимущество async предоставляет здесь, просто используя синхронные вызовы:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Disassociate(string loginProvider, string providerKey)
{
ManageMessageId? message = null;
//why use an async database call here with await instead of just using a synchronous one?
IdentityResult result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));
if (result.Succeeded)
{
message = ManageMessageId.RemoveLoginSuccess;
}
else
{
message = ManageMessageId.Error;
}
return RedirectToAction("Manage", new { Message = message });
}
Что мне не хватает?
Предоставляет ли это какое-то преимущество в производительности для типа ожидания, которое будет происходить здесь?
Ответы
Ответ 1
На стороне сервера (например, ASP.NET MVC) любые операции ввода/вывода (например, базы данных) должны выполняться асинхронно. Это освобождает поток запроса за время, в течение которого ввод/вывод находится в полете.
Итак, когда RemoveLoginAsync
отправляет свой SQL в базу данных, он возвращает неполную задачу, и когда запрос попадает в await
, он возвращает поток запроса в пул потоков. Позже, когда операция БД завершается, поток запросов берется из пула потоков и используется для продолжения запроса.
Конечным результатом является масштабируемость, потому что (в случае, по крайней мере, 99,9%) задачи масштабируются лучше, чем потоки. Тем не менее, нет большого преимущества, если ваша база данных является всего лишь одним сервером, и все запросы попадают в db, потому что узким местом в этом сценарии является сервер db, а не веб-сервер.