Mig*_*ura 17 asp.net-mvc async-await asp.net-mvc-5
我正在查看ASP.NET MVC 5模板,我注意到许多操作并标记为异步:
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { }
Run Code Online (Sandbox Code Playgroud)
我什么时候应该在MVC行动上这样做?它何时包含对数据库的访问权限?
如果我在操作中调用存储库,我还应该使用Task来使其异步吗?
usr*_*usr 11
你的问题的核心是:我什么时候应该让我的MVC动作异步?有关该问题的详细讨论,请参见http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx.他只讨论数据库,但他的观点仍然存在.
从本质上讲,几乎从不以异步方式调用数据库.
对于使用异步操作来减少Web服务器上被阻塞线程数的数据库应用程序几乎总是浪费时间.
如果可能的话,不要让人们告诉您始终使用异步IO.异步现在风靡一时.许多不合理的建议正在传播.
实体框架6(默认情况下与MVC 5一起使用)现在支持异步数据库调用,因此操作方法签名已更新以反映正在使用的异步.简单的答案是,只要您有可能涉及等待的任务,请使用异步.希望您的数据库查询不会花费太长时间来实现往返实际从异步中获益,但如果您的数据库崩溃或受到特别严重的打击,它至少有助于在此过程中不会使IIS死锁.
这里有一篇文章列出了使用任务可能带来好处的一些用例以及可能产生相反效果的一些用例.答案不是每次都这么简单,这就是为什么关于测试的最后一点.
引自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可以通过使用异步方法为这些阻塞调用服务更多请求.
| 归档时间: |
|
| 查看次数: |
16504 次 |
| 最近记录: |