我正在查看ASP.NET MVC 5模板,我注意到许多操作并标记为异步:
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { }
我什么时候应该在MVC行动中这样做?什么时候它包含对数据库的访问权?
如果我在操作中调用存储库,我是否也应该使用Task来使其异步?
答案 0 :(得分:11)
你的问题的核心是:我什么时候应该让我的MVC动作异步?有关该问题的详细讨论,请参阅http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx。他只讨论数据库,但他的观点仍然存在。
基本上,几乎从不以异步方式调用数据库。
对于使用异步操作来减少Web服务器上被阻止线程数量的数据库应用程序几乎总是浪费时间。
如果可能的话,不要让人们告诉您始终使用异步IO。异步现在风靡一时。很多不合理的建议正在传播。
答案 1 :(得分:9)
实体框架6(默认情况下与MVC 5一起使用)现在支持异步数据库调用,因此操作方法签名已更新以反映正在使用的异步。简单的答案是,只要您有可能涉及等待的任务,请使用异步。希望您的数据库查询不会花费太长时间来实现往返实际从异步中获益,但如果您的数据库崩溃或受到特别严重的打击,它至少有助于在此过程中不会使IIS死锁。
答案 2 :(得分:5)
这篇文章列出了使用任务时可能有一些好处和一些用途的一些用例 情况可能会产生相反的效果。 答案不是每次都这么简单,这就是关于测试的最后一点。
来自http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4
通常,在以下条件下使用同步方法:
- 操作简单或短时间运行。
- 简单比效率更重要。
- 操作主要是CPU操作,而不是涉及大量磁盘或网络开销的操作。使用异步 对CPU绑定操作的操作方法没有任何好处 导致更多的开销。
通常,在以下条件下使用异步方法:
- 您正在调用可以通过异步方法使用的服务,并且您使用的是.NET 4.5或更高版本。
- 操作是网络绑定或I / O绑定而不是CPU绑定。
- 并行性比简单的代码更重要。
- 您希望提供一种机制,让用户取消长时间运行的请求。
- 当切换线程的好处加权上下文切换的成本。通常,您应该使方法异步,如果 在执行时,同步方法在ASP.NET请求线程上等待 没工作。通过使调用异步,ASP.NET请求线程 在等待Web服务时不会停止工作 要求完成。
- 测试表明,阻止操作是站点性能的瓶颈,IIS可以通过使用来为更多请求提供服务 这些阻塞调用的异步方法。