将 await 与异步数据库调用一起使用有啥好处

Posted

技术标签:

【中文标题】将 await 与异步数据库调用一起使用有啥好处【英文标题】: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 );
    

我错过了什么?

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

那么使用异步操作它只会占用一个线程而不是等待?太酷了 正确,如果你所有的 I/O 都是async,那么线程只用于执行代码。这听起来很奇怪,但是当请求正在等待(即异步等待)时,根本没有线程处理请求是正常的。

以上是关于将 await 与异步数据库调用一起使用有啥好处的主要内容,如果未能解决你的问题,请参考以下文章

将 ref 关键字与引用类型参数一起使用有啥好处?

将 async/await (Swift 5.5) 与 firebase 实时数据库一起使用

如何将 RestSharp 与 async/await 一起使用

从生成器迁移到异步/等待

Async Await异步调用WebApi

是否可以将 Flask RestX 与 Flask 2.0+ 异步等待一起使用?