ASP.NET MVC异步 - 是EntityFramework查询CPU绑定还是网络绑定或I / O绑定

时间:2015-03-03 11:26:23

标签: asp.net asp.net-mvc asynchronous entity-framework-6

在ASP.NET MVC项目中使用基于任务的Asynch操作方法来检索一堆使用LINQ-to-EF的EntityFramework查询是否值得。该网站与数据库一样托管在Azure中。有很多查询加载了一堆数组,通过JSON发送到客户端的ajax调用。

2 个答案:

答案 0 :(得分:1)

只要您使用真正的异步api(例如EntityFramework异步方法)并且不创建异步包装器,例如将同步内核包装在Task.RunTask.FromResult中,这是值得的。 异步方法不会在执行时阻塞任何线程(Great article about this)。

顺便说一句,因为您的应用程序和数据库都是基于云的,所以考虑async方法实际上是有意义的,因为您的应用程序和数据库都可以扩展。

答案 1 :(得分:1)

从技术上讲,这三者都是。发送查询/接收结果时存在网络延迟。当SQL Server或其他任何实际运行查询针对您的数据库时,有CPU限制的工作,并且因为数据库本身是文件系统上的文件而有I / O.

但是,从您的应用程序的角度来看,通过Entity Framework与外部数据库进行交互是网络限制的,因此有资格获得异步。

然而,异步不是一个神奇的药丸,会让你的应用程序运行得更快。如果使用async的任何内容实际上可以减慢你的应用程序的速度,因为异步工作需要很多开销。它唯一的目的是允许线程在其控制之外的某个任务等待完成时返回池中。在数据库查询的情况下,查询被发送到数据库,这需要一段时间,具体取决于网络延迟。数据库必须运行查询并构造一个结果,该结果需要一段时间,具体取决于该服务器上可用的资源。然后,结果将发送回您的应用程序,这又会导致网络延迟。在同步场景中,您的应用程序只会坐在那里等待,保持线程。在异步方案中,线程被释放以执行其他工作(服务器对Web服务器的其他请求等),然后在收到数据库响应时,请求线程返回以完成应用程序中发生的任何事情。

如果情况不明显,其目的是允许网络服务器或您正在使用的任何其他工具通过利用其他工作停机时间来处理额外负载。在这方面,异步对于有效使用资源很重要,但它不一定更快或更高效。