所有实体框架方法都应该使用异步吗? [关闭]

Posted

技术标签:

【中文标题】所有实体框架方法都应该使用异步吗? [关闭]【英文标题】:Should all Entity Framework methods use async? [closed] 【发布时间】:2017-03-26 13:45:42 【问题描述】:

在 Asp.Net MVC 或 Asp.Net Web API 中,让查询数据库的每个控制器操作(即使是最简单的查询)都使用异步/等待模式是一种好习惯吗?

我知道使用 async/await 会增加复杂性,但添加它值得吗?即使是最简单的查询?

【问题讨论】:

理论上:是的。因为每个 DB 调用都是 IO 绑定的,因此会阻塞线程。但在实践中,只有当您的 Web 服务或 Web 应用具有足够高的流量时,增加的复杂性才值得。 这与流量无关。这是关于线程成为稀缺资源,通常它们是充足的。使用异步数据库访问几乎不会增加吞吐量。 【参考方案1】:

Entity Framework 使用数据库并且需要访问数据库服务器。使用 EF,您需要连接数据库服务器并等待服务器响应您的请求。

如果您的应用程序使用磁盘或网络(如访问数据库)读/写,那么它正在执行 I/O 操作。每个 I/O 操作都应使用 async/await 模式是一种很好的做法,这是 EF6 公开了许多您可以使用的异步操作的方式。

I/O bound 是指完成所需时间的条件 计算主要取决于等待所花费的时间 用于完成输入/输出操作。 来源:***

一些精度:

每个 ASP.Net Web API 请求都使用一个由 .Net Framework 线程池提供的线程。如果您对 ASP.Net Web API 操作使用同步方法,那么 I/O 绑定操作(数据库访问)将阻塞线程并等待数据库响应。您的请求使用的线程将被阻塞,不会返回到线程池。

线程池使用的最大线程数为 5000 (.Net 4.5)。如果您的应用程序是大型应用程序,则可以快速达到最大值。如果线程池中没有可用的线程,则将新请求添加到队列中。如果您的服务器队列已满,它将拒绝具有 HTTP 503 状态的请求,该状态代表 “服务器太忙”

如果您的 ASP.Net Web API 操作使用异步/等待模式,则每个 I/O 绑定操作都会释放当前请求的线程。这个线程可以被另一个请求使用。如果 I/O 绑定操作完成了它的任务,那么会给出另一个线程来处理 ASP.Net Web API 操作方法的其余部分。

所以回答你的问题。如果您的应用程序可以具有大量并发性,则需要访问数据库的 ASP.Net Web API 的每个操作都应使用 async/await 模式。即使您的应用程序不是较大的应用程序,也始终建议使用 async/await 进行 I/O 绑定操作。

您可以查看此article。它讨论了 ASP.Net MVC 的“使用异步方法”,但大多数建议可用于 ASP.Net Web API。

【讨论】:

是的,你是对的。但我应该考虑只对需要更长时间的复杂查询使用异步吗?使用异步是否会增加任何复杂性? @Arvin I/O 绑定操作并不意味着长时间运行的操作,而只是读/写访问,可能会阻塞线程而不消耗大量 CPU。我更新了我的答案以获得更高的精度。 谢谢你,你知道我可以研究更多关于我的问题的任何文章或参考资料吗? @Arvin 在我的回答中添加了一个链接:)

以上是关于所有实体框架方法都应该使用异步吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

所有的 GUI 框架都使用 Windows API 吗? [关闭]

我应该将 AngularJS 与 PHP 框架混合使用吗? [关闭]

我应该将 AngularJS 与 PHP 框架混合使用吗? [关闭]

这是与实体框架交互的正确方法吗?

我可以将实体框架上下文保留为类变量吗?

我应该使用实体框架 4.1 和 MVC3 启用或禁用动态代理吗?