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

时间:2016-11-12 12:56:02

标签: c# asp.net-mvc asynchronous asp.net-web-api entity-framework-6

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

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

1 个答案:

答案 0 :(得分:11)

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操作方法。

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

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