使用await与异步数据库调用有什么好处

我只是看看默认的MVC5项目以及它如何在控制器中使用async。

我想知道async在简单地使用同步调用时提供了什么好处:

[HttpPost] [ValidateAntiForgeryToken] public async Task 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 }); } 

我错过了什么?

这是否会在此处发生的等待类型中提供某种性能优势?

在服务器端(例如,ASP.NET MVC),您所做的任何I / O(例如,数据库)都应该异步完成。 这会释放I / O正在运行的请求线程。

因此,当RemoveLoginAsync将其SQL发送到数据库时,它会返回一个不完整的任务,当请求到达await ,它会将请求线程返回给线程池。 稍后,当DB操作完成时,将从线程池中获取请求线程并用于继续请求。

最终结果是可伸缩性,因为(至少在99.9%的情况下)任务比线程更好地扩展。 但是,如果您的数据库只是一台服务器且所有请求都访问了数据库,则没有很大的优势,因为该场景中的可伸缩性瓶颈是数据库服务器,而不是Web服务器。