【问题标题】:What is the benefit to using await with an async database call将 await 与异步数据库调用一起使用有什么好处
【发布时间】:2014-01-18 01:33:27
【问题描述】:

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

我想知道 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 });
    }

我错过了什么?

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

【问题讨论】:

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


    【解决方案1】:

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

    所以,当RemoveLoginAsync将其SQL发送到数据库时,它会返回一个未完成的任务,而当请求命中await时,它会将请求线程返回到线程池。稍后,当 DB 操作完成时,会从线程池中取出一个请求线程,用于继续请求。

    最终结果是可伸缩性,因为(至少在 99.9% 的情况下)任务的伸缩性比线程好。但是,如果您的数据库只是单个服务器并且所有请求都命中 db,则没有太大优势,因为在这种情况下您的可伸缩性瓶颈是 db 服务器,而不是 Web 服务器。

    【讨论】:

    • 那么使用异步操作它只会占用一个线程而不是等待?太酷了
    • 正确,如果你所有的 I/O 都是async,那么线程只用于执行代码。这听起来很奇怪,但是当请求正在等待(即异步等待)时,根本没有线程处理请求是正常的。
    猜你喜欢
    • 1970-01-01
    • 2014-02-09
    • 2021-06-06
    • 2013-09-24
    • 2012-03-16
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多