Question: I've been using MVC since version 2, and lately I have come across a project where all of the controller actions are 'async', returning Tasks, and I am trying to understand why somebody would do this.

The View Model for each view is built via an async call to an API. I understand that in order to use the await keyword one must use an async method (and return a Task), but surely without the View Model then the view will fail. There is no choice but to wait for the API to build my View Model.

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

```

For what reason would controller actions need to be asynchronous?

Answer: 
Let's assume that your part of code

```
MyAPI.BuildMyCarViewModel()

```

needs for execution 15 seconds.   
 Then let's assume, that you have 10 000 users, which in range of 2 seconds decided to load some model.  
 And then assume that you don't use caching ( for the sake of example ).
IIS by default has pool of threads 5000.
In described case application pool of IIS will be busy with 5000 threads which will translate into awaiting of your 5000 users for 5 seconds, and other 5000 users will wait until code finish executing. But with async/await .Net will generate state machine, and threads will be executed till moment of awaiting, and then threads will be released for making another useful job. And as soon as 

```
MyAPI.BuildMyCarViewModel()

```

will return results, other threads or the same threads will return you result. And as outcome application pool of IIS will not be exhausted quickly for long running tasks and your users will receive response much faster, then without usage await/async.   
 If to put simply, await/async gives you possibility to avoid thread pool exhausting quickly for long running fragments of code.
I have an MSDN article on the topic of [`async` ASP.NET](https://msdn.microsoft.com/en-us/magazine/dn802603.aspx). In summary, the benefit is that the request does not take up a thread for the duration of the request. This allows your web app to scale if your backend can scale.