【问题标题】:Async Action Methods异步操作方法
【发布时间】:2013-11-03 14:47:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 async-await


    【解决方案1】:

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

    【讨论】:

    • 这个建议需要论证。
    • @usr:你在寻找什么样的理由?理由已经存在。如果数据库服务器由于某种原因需要特别长时间来响应请求,您将给 IIS 一些喘息的空间来处理额外的请求。异步的本质意味着当线程处于等待状态时,它可以返回到池中做其他工作,而不是坐在那里锁定,等待任务完成。
    • 如果您希望数据库平均在 10 毫秒内响应并且需要 10 秒,您可以返回所有您想要的线程。应用程序已关闭。 ASP.NET 中的线程并不稀缺。默认情况下有数百个,没有一个普通的数据库可以从这么多的并行请求中受益。异步数据库调用的情况很弱。
    • 1) 线程稀缺。在典型的设置中,一个 Web 服务器可能只有 1000 个可供使用。 2)每个请求至少需要一个线程,所以你有“数百个”这个事实并没有那么令人印象深刻。如果您的 Web 服务器必须同时处理 1000 个以上的请求而停止运行,您可以接受,请继续使用同步。 3)您假设每个网络请求都必须调用数据库。仅仅因为数据库运行缓慢或完全停机并不意味着您的网站必须随之停机。
    • 世界上几乎没有网站需要处理 1000 个并发请求。例如,尽管 Stack Overflow 是前 100 名网站,但它从来没有这样做过。只有当所有这些请求都等待很长时间时才会发生这种情况。就像 web 服务或 websocket。这些都是异步的好案例。如果一个数据库有 1k 个并发请求,它就会完全过载。这种架构是不可行的,所以同步或异步的点在这里没有实际意义。换一种说法:通过使数据库调用异步,您不会获得更多的吞吐量或更好的延迟。这是这样做的唯一要点。
    【解决方案2】:

    您的问题的核心是:我应该什么时候使我的 MVC 操作异步?请参阅http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx 以获得对该问题的良好讨论。他只谈论数据库,但他的观点延续了下来。

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

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

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

    【讨论】:

    • 应该更改,引用的文章从 2012 年 11 月 28 日开始更新,声明...“await、async 和 Task 对象的组合使您可以更轻松地在 . NET 4.5。既然 EF 6 支持异步查询和保存,您应该利用异步编程"
    • @PaulHatcher 我完全不同意这个结论。请参阅我关于此主题的其他文章:stackoverflow.com/a/25087273/122718stackoverflow.com/a/12796711/122718。如果整个社区都热衷于一项新的酷技术,而没有人真正说出原因,那么您应该开始提问。
    【解决方案3】:

    这是一篇文章,其中列出了使用任务时可能有好处的一些用例和一些用途 可能会产生相反效果的情况。 答案并不是每次都这么简单,这就是为什么最后一点关于测试的原因。

    引用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 可以通过使用 这些阻塞调用的异步方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2017-03-12
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      相关资源
      最近更新 更多