Not*_*ple 13 c# async-await entity-framework-6 asp.net-mvc-5
我只是看看默认的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 });
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
这是否会在此处发生的等待类型中提供某种性能优势?
Ste*_*ary 27
在服务器端(例如,ASP.NET MVC),您所做的任何I/O(例如,数据库)都应该异步完成.这将释放I/O正在运行的时间的请求线程.
因此,当RemoveLoginAsync它将SQL发送到数据库时,它返回一个不完整的任务,当请求命中时await,它将请求线程返回给线程池.稍后,当DB操作完成时,将从线程池中获取请求线程并用于继续请求.
最终结果是可伸缩性,因为(至少在99.9%的情况下)任务比线程更好地扩展.但是,如果您的数据库只是一台服务器并且所有请求都到达数据库,则没有很大的优势,因为该场景中的可伸缩性瓶颈是数据库服务器,而不是Web服务器.