MVC - 作为Task <actionresult>的所有控制器操作的好处是什么?

时间:2016-03-10 10:34:32

标签: asp.net-mvc-4 asynchronous

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

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

public async Task<ActionResult> MyCar()
    {
        return View(await MyAPI.BuildMyCarViewModel());
    }

控制器操作需要异步的原因是什么?

2 个答案:

答案 0 :(得分:1)

我有一篇关于async ASP.NET主题的MSDN文章。总之,好处是请求在请求期间不占用线程。如果您的后端可以扩展,这可以让您的Web应用程序扩展。

答案 1 :(得分:1)

让我们假设您的代码部分

MyAPI.BuildMyCarViewModel()

需要执行15秒。
然后让我们假设你有10 000个用户,在2秒的范围内决定加载一些模型。
然后假设你不使用缓存(为了举例)。 默认情况下,IIS具有5000个线程池。 在描述的情况下,IIS的应用程序池将忙于5000个线程,这将转换为等待5000个用户5秒,其他5000个用户将等待代码完成执行。但是使用async / await .Net将生成状态机,并且线程将被执行直到等待的时刻,然后线程将被释放以进行另一个有用的工作。并且一旦

MyAPI.BuildMyCarViewModel()

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