17

我正在查看 ASP.NET MVC 5 模板,我注意到许多操作并标记为异步:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { }

我应该什么时候对 MVC 操作执行此操作?它何时包含对数据库的访问?

如果我在操作中调用存储库,我是否还应该使用 Task 使其异步?

4

3 回答 3

11

你的问题的核心是:我什么时候应该让我的 MVC 动作异步?有关该问题的详细讨论,请参阅http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx。他只谈论数据库,但他的观点延续了下来。

本质上,几乎从不以异步方式调用数据库。

对于使用异步操作来减少 Web 服务器上阻塞线程数的数据库应用程序来说,几乎总是完全浪费时间

不要被那些告诉你尽可能使用异步 IO 的人分心。异步现在风靡一时。许多非理性的建议正在传播。

于 2013-10-24T19:25:37.760 回答
9

Entity Framework 6(默认与 MVC 5 一起使用)现在支持异步数据库调用,因此操作方法签名已更新以反映正在使用的异步。简单的答案是,每当您有可能涉及等待的任务时,请使用异步。希望您的数据库查询不会花费足够长的时间来往返以真正从异步中受益,但是如果您的数据库出现故障或受到特别严重的打击,它至少有助于在此过程中不使 IIS 死锁。

于 2013-10-24T18:35:07.503 回答
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 可以通过对这些阻塞调用使用异步方法来服务更多请求。
于 2015-01-11T16:02:19.160 回答