3

在Asp.Net MVC或Asp.Net Web API中,让每个控制器查询数据库(即使是最简单的查询)都使用异步/等待模式的操作,是不是很好?是否所有实体框架方法都使用异步?

我知道使用异步/等待增加了复杂性,但增加值得吗?即使是最简单的查询?

+0

理论上:是的。因为每个DB调用都是IO绑定的,所以会阻塞线程。但实际上,只有当您的webservice或webapp具有足够高的流量时才是值得的复杂性。 – Dai

+0

这不关乎流量。这是关于线程成为稀缺资源的问题,通常它们是充足的。使用异步数据库访问几乎不会增加吞吐量。 – usr

回答

7

实体框架使用数据库并需要访问数据库服务器。使用EF您需要连接数据库服务器并等待服务器响应您的请求。

如果您的应用程序使用磁盘或网络(如访问数据库)读/写,那么它正在做I/O操作。每个I/O操作都应该使用异步/等待模式,这是EF6公开许多可以使用的异步操作的良好习惯。

I/O绑定是指一种状态,其中所花费的时间来完成 计算主要由周期确定花在等待 用于输入/输出操作来完成的。 来源:维基百科

一些精度:

每个ASP.Net的Web API请求使用由.Net框架线程池给一个线程。如果对ASP.Net Web API操作使用同步方法,则I/O绑定操作(数据库访问)将阻塞该线程并等待数据库作出响应。您的请求使用的线程将被阻止,并且不会返回到线程池。

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

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

所以要回答你的问题。如果您的应用程序可能具有很多并发性,那么需要访问数据库的ASP.Net Web API的每个动作都应该使用异步/等待模式。即使您的应用程序不是更大的应用程序,也总是建议对I/O绑定操作使用异步/等待。您可以选择article。它讨论了ASP.Net MVC的“使用异步方法”,但大多数建议都可以用于ASP.Net Web API。

+0

是的,你说得对。但是我应该考虑只使用需要更长时间的复杂查询的异步吗?正在使用异步增加任何复杂性? – Kahbazi

+0

@保存I/O绑定操作并不意味着长时间运行的操作,而只是读取/写入访问,可能会阻塞您的线程而不消耗大量的CPU。我更新了更多精确度。 – CodeNotFound

+0

谢谢你,你知道我可以学习更多关于我的问题的任何文章或参考吗? – Kahbazi

相关问题