在 Asp.Net MVC 或 Asp.Net Web API 中,每个查询数据库的控制器动作(即使是最简单的查询)使用 async/await 模式,这是否是一个好的实践呢?
我知道使用 async/await 会增加复杂性,但即使针对最简单的查询,添加它是否值得呢?
在 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状态拒绝请求,表示"服务器过于繁忙"。
如果您的ASP.Net Web API操作使用async / await模式,则每个I/O绑定操作都将释放当前请求的线程。此线程可以被另一个请求使用。如果I/O限制操作完成了其任务,则另一个线程被赋予继续处理您的ASP.Net Web API动作方法的其余部分。
因此,为了回答您的问题,如果您的应用程序可能具有大量并发,请使用async/await模式来访问数据库的每个ASP.Net Web API操作。即使您的应用程序不是大型应用程序,建议始终对I/O受限操作使用async/await。
你可以查看这篇文章。它讨论了ASP.Net MVC中的“使用异步方法”,但大部分建议也适用于ASP.Net Web API。