使用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服务器。
- 值不能为空。 参数名称:items(在下拉列表中)ASP.NET MVC5
- 了解异步和等待
- FormsAuthentication对象已废弃
- System.Web.WebPages中的MethodAccessException将mvc 3迁移到mvc 5
- .NET Framework中的复杂声明值与System.Security.Claims
- 如何强制只匿名访问控制器操作?
- 在ASP.NET MVC应用程序中使用HandleErrorAttribute
- 升级到Web API 2后,HttpApplication.Application_Start未触发
- Identity 2.0:创建自定义ClaimsIdentity例如:User.Identity.GetUserById (int id)for Per Request Validation