所有Entity Framework方法都应该使用异步吗?

在Asp.Net MVC或Asp.Net Web API中,使用查询数据库(即使是最简单的查询)的每个控制器操作都使用async / await模式是不错的做法?

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

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状态的请求,即“Server Too Busy”

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

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

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