我们目前正在构建一个MVC 5应用程序,该应用程序调用一个调用数据库的业务层,没有WCF或Web Api服务。我们所有的控制器目前都不是异步的,我一直在研究任务/异步,并想知道在控制器异步中制作所有动作是否变得普遍?对我们来说,所有操作都要求业务层通过Entity Framework读取数据,那么将它们全部更改为asnyc是否有意义?或者只有在存在中间层时才有用,例如WCF或Web API服务可能涉及网络延迟,值得吗?
答案 0 :(得分:1)
所有异步都允许将处于等待状态的线程返回到线程池以进行其他操作。当原始线程等待完成的任何操作时,从线程池请求一个线程来完成总体任务。因为线程必须等待,所以某些操作(如通过HTTP向API发出请求)是异步的理想选择,而其他操作(如复杂计算和其他CPU绑定工作)完全不适合异步。
现在,既然您的问题与数据库查询有关,那么答案取决于它。例如,如果您的数据库恰好与您的网站位于同一台服务器上(这完全不是一个好主意BTW)async对您没有多大帮助。可能会有一些等待,但它可能是微不足道的,它可能需要更长的时间来传递线程,而不是仅仅保持线程直到数据库完成其工作。现在,如果您正确处理并且数据库位于远程服务器上,则网络延迟开始发挥作用。内部网络上的数据库可能仍然无法从异步中受益,因为延迟可能仍然非常低,但异步仍然可能对某些人有所帮助。但是,如果您的数据库位于外部网络上,那么异步肯定是合理的,因为延迟会更高。
尽管如此,使用异步可能比使用异步更好。即使延迟很低,也可能并非总是如此。如果您的网络受到重创,将所有内容设置为异步将为您的Web服务器提供一些有价值的余地,以便在负载下可能会死锁。