Asp.net mvc 4 MVC-所有控制器操作都是任务的好处是什么<;ActionResult>;?

Asp.net mvc 4 MVC-所有控制器操作都是任务的好处是什么<;ActionResult>;?,asp.net-mvc-4,asynchronous,Asp.net Mvc 4,Asynchronous,我从版本2开始就使用MVC,最近我遇到了一个项目,其中所有控制器操作都是“异步”的,返回任务,我试图理解为什么有人会这样做 每个视图的视图模型都是通过对API的异步调用构建的。我知道为了使用wait关键字,必须使用异步方法(并返回任务),但如果没有视图模型,视图肯定会失败。别无选择,只能等待API构建我的视图模型 public async Task<ActionResult> MyCar() { return View(await MyAPI.BuildMyC

我从版本2开始就使用MVC,最近我遇到了一个项目,其中所有控制器操作都是“异步”的,返回任务,我试图理解为什么有人会这样做

每个视图的视图模型都是通过对API的异步调用构建的。我知道为了使用wait关键字,必须使用异步方法(并返回任务),但如果没有视图模型,视图肯定会失败。别无选择,只能等待API构建我的视图模型

public async Task<ActionResult> MyCar()
    {
        return View(await MyAPI.BuildMyCarViewModel());
    }
公共异步任务MyCar()
{
返回视图(等待MyAPI.BuildMyCarViewModel());
}

为什么控制器操作需要异步?

我有一篇MSDN文章,主题是。总之,好处是请求在请求期间不占用线程。如果您的后端可以扩展,这将允许您的web应用进行扩展。

假设您的部分代码

MyAPI.BuildMyCarViewModel()
需要执行15秒
然后让我们假设您有10000个用户,这些用户在2秒内决定加载某个模型。
然后假设您不使用缓存(为了示例)。 默认情况下,IIS有5000个线程池。 在所描述的情况下,IIS的应用程序池将忙于处理5000个线程,这将转化为等待5000个用户5秒钟,而其他5000个用户将等待代码完成执行。但使用async/await.Net将生成状态机,线程将一直执行到等待的时刻,然后线程将被释放以进行另一个有用的作业。一旦

MyAPI.BuildMyCarViewModel()

将返回结果,其他线程或相同线程将返回结果。作为结果,对于长时间运行的任务,IIS的应用程序池不会很快耗尽,并且您的用户将更快地收到响应,而无需使用wait/async
简单地说,wait/async可以避免线程池因长时间运行的代码片段而迅速耗尽。

好,但用户不是被迫静坐等待这15秒,因为视图需要ViewModel才能渲染吗?是的,用户将被迫静坐等待15秒。但如果没有async/wait,只有前5000个用户将等待15秒+响应时间。其他用户将坐在那里等待幸运用户释放资源,等待时间为15秒。使用async/Wait时,所有用户都有机会在15秒+响应同步+响应时间的范围内获得服务。请注意,你不必为同步而头痛。所以你要说的是。。。如果我的ViewModel是通过一种需要很长时间的方法构建的,并且如果我有很多用户,那么异步控制器操作是有意义的。否则就没有意义了?如果只从这两点(许多用户,方法执行缓慢)来看待世界,那么你就正确地理解了一切。但我建议你考虑另外一点。它不需要很多努力就可以让您的控制器为许多用户和长时间的处理做好准备。也就是说,要提前准备好代码。所以,如果应用异步/等待构造不需要太多的思维能力,那么为什么不使用它们呢?这有意义吗?您想知道更多的原因吗?您能否给我一个示例,说明何时需要控制器操作(返回视图)是异步的。我只能想,如果您的内部有一些方法需要花费大量时间来执行,并且您希望释放服务器以处理其他请求。但是,我只有几个异步操作。不是所有的。@VictorySaber:这不是返回视图的问题,而是创建传递给视图的模型的操作。可伸缩后端的任何I/O都是异步操作的好选择。因此,如果您的后端是Azure Tables/Blob或Azure SQL或MongoDB或某些云API,那么您肯定希望这些操作是异步的。如果您的后端不可伸缩(例如,SQL Server的单个实例),那么(可能)使这些操作异步化是没有意义的,即使它们是基于i/O的。