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

时间:2013-12-31 04:44:52

标签: c# async-await asp.net-mvc-5 entity-framework-6

我只是看看默认的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 个答案:

答案 0 :(得分:27)

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

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

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