Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC Async-EntityFramework查询是CPU绑定、网络绑定还是I/O绑定_Asp.net_Asp.net Mvc_Asynchronous_Entity Framework 6 - Fatal编程技术网

ASP.NET MVC Async-EntityFramework查询是CPU绑定、网络绑定还是I/O绑定

ASP.NET MVC Async-EntityFramework查询是CPU绑定、网络绑定还是I/O绑定,asp.net,asp.net-mvc,asynchronous,entity-framework-6,Asp.net,Asp.net Mvc,Asynchronous,Entity Framework 6,在ASP.NET MVC项目中使用基于任务的异步操作方法来检索大量使用LINQ to EF的EntityFramework查询是否值得。该网站与数据库一样托管在Azure中。有相当多的查询加载了一组数组,通过JSON从客户端发送到ajax调用。只要您使用真正的异步api(如EntityFramework异步方法),这是值得的并且不创建异步包装器,例如通过在Task.Run或Task.FromResult中包装同步内核。 异步方法在执行()时不会阻塞任何线程 顺便说一句,由于您的应用程序和数据库都

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

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


顺便说一句,由于您的应用程序和数据库都是基于云的,因此研究
异步方法实际上是有意义的,因为您的应用程序和数据库都可以扩展。

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

但是,从应用程序的角度来看,通过实体框架与外部数据库交互是网络绑定的,因此符合异步的条件

然而,异步并不是让你的应用运行得更快的神奇药丸。如果说使用异步的任何东西实际上都会降低应用程序的速度,那么异步工作会有很多开销。它的唯一用途是允许执行工作的线程在等待其控制范围之外的某个任务完成时返回池。对于数据库查询,查询被发送到数据库,这需要一段时间,具体取决于网络延迟。数据库必须运行查询并构造一个结果,该结果需要一段时间,这取决于该服务器上可用的资源。然后,结果会发送回应用程序,这会再次导致网络延迟。在同步场景中,应用程序只需坐在那里等待线程。在异步场景中,线程被释放以执行其他工作(服务器对web服务器的其他请求等),然后当收到数据库响应时,线程被请求返回以完成应用程序中发生的任何事情


如果不是很明显,那么这样做的目的是允许web服务器或您正在使用的任何其他设备通过利用停机时间来处理额外的负载。在这方面,异步对于高效地使用资源很重要,但它不一定更快或更高性能。

你问了一个错误的问题,在你的操作方法上使用
async
并不能神奇地提高性能。什么是正确的问题取决于你的实际问题,你没有解释。回答“EntityFramework查询是CPU绑定还是网络绑定或I/O绑定”不太可能有帮助。没有问题。我只是想让我的网站规模更好。演出已经很好了。我总是可以在Azure上添加更多资源,但我想充分利用我已经获得的资源。我不认为这样问是不合理的。是的,这是一般性的,取决于我的情况,但我不打算展示整个网站。主要因素始终是你查询数据库的方式,你如何编写实际查询,你在数据库中有什么索引,表是否进行了强规范化等。您通常可以通过优化查询方式来加快数据层的速度,无论您是否使用EF或其他任何工具。我知道这方面的大部分内容,但谢谢。我已经读到异步在某些情况下可能会更慢,但我不清楚在什么情况下会更慢。保持线程池可用似乎很好,这是所有Node.js爱好者都告诉我的。我想我必须对它进行编码并进行一些负载测试。我明白,如果这些只是直接的db调用,那么基本上没有任何好处,除非很多人一次访问该网站,并且线程被用完。最终,分析是唯一确定的方法。异步是一种微优化,因为除非您的web服务器达到最大请求数(通常为1000个同时请求),否则您不会看到真正的好处。对于大多数网站和应用程序来说,这是非常重要的。尽管如此,通常最好从一开始就使用async,以防万一有这么多流量。