c# - 我们如何通过在 asp.net MVC 6 中实现异步 Controller 来实现性能?

标签 c# asp.net-mvc wcf asp.net-mvc-4 model-view-controller

什么时候在 ASP.NET MVC 中使用异步 Controller 是明智的。

是否涉及任何编码或性能成本?

MSDN 建议将它用于长时间运行的进程,但我很好奇如果我们将它用作普通 Controller 的完全替代品是否会有好处?

我们计划将 WCF 服务与我们的 Controller 方法结合使用。

最佳答案

首先,异步不是“性能”的同义词。事实上,使用异步实际上会降低性能,因为异步涉及大量开销。

async 所做的 是将处于等待状态的线程释放回池中。这意味着您的 Web 服务器在用尽“最大请求数”之前会获得更高的阈值,换句话说,用完可用线程来处理新请求。

在同步请求中,线程被捆绑用于整个请求。如果有一些等待时间(来自 API 调用的网络延迟等),即使实际上没有任何工作正在完成,它也会保留该线程。如果您同时遇到 1000 个请求(网络服务器的典型开箱即用最大请求),那么每个进一步的请求都将排队,直到前 1000 个线程中的一个返回到池中。

在异步请求中,一旦线程正在等待某事发生(即不工作),它就会返回到池中,即使它正在服务的原始请求尚未完成。这允许处理新请求。当放弃线程的原始任务完成时,会从池中请求一个新线程来继续为该请求提供服务。这有效地为您的服务器在负载下提供了一点喘息空间。除此之外,async 什么都不做,至少在请求由网络服务器提供服务的上下文中是这样。

一般来说,建议使用异步,因为即使它提供的一点喘息空间也可能意味着您的服务器处理负载或崩溃之间的差异。但是,您应该衡量您对异步的使用情况,以确保您实际上购买了值得它增加的开销的东西。例如,MVC 6 允许您执行异步渲染部分等操作。但是,如果您的服务器配备了企业级 15,000 RPM 硬盘驱动器或 SSD,则线程等待的时间可能会非常短,以至于来回传递线程实际上比操作本身花费更多的时间, 同步运行。

关于c# - 我们如何通过在 asp.net MVC 6 中实现异步 Controller 来实现性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31839127/

相关文章:

web-services - 如何托管 Restful WCF Web 服务

datagridview 的单个单元格中的 C# 多色文本

c# - Creators Update 后在 OnCollectionChanged 上获取线程访问异常

c# - 安装后自动启动Windows服务

asp.net-mvc - 基于 Fluent Nhibernate 模型的 ASP.NET MVC JSON

wcf - 是否建议将 self 跟踪实体与 WCF 服务一起使用?

c# - WCF 消耗多个可能的 REST 响应

javascript - Jquery 函数不适用于 TextArea

c# - ASP.NET Controller 基类 User.Identity.Name

c# - 从特定位置的JSON格式中取出一条记录