Good question. Using asynchronous methods is all about using the resources effectively as well as give a good user experience. Any time you need to call on a resource that could take time to collect, it's good to use an async call.
This will do a few things. First, while a worker thread is waiting for data, it can be put on 'hold' so to speak, and that worker thread can do something else until the data is returned, an error is returned or the call just times out.
This will give you the second advantage. The interface the user is using to call the resource will be released, temporarily, to do other things. And overall, less server resources are consumed by idle processes.
I'd recommend watching the videos on this page here: https://channel9.msdn.com/Series/Three-Essential-Tips-for-Async
It's probably the clearest explanation that can help leapfrog your learning on async.
WaitAllis blocking method, it isn't a good idea to use with the asynchronous codeasync await. It's a leaky abstraction, and you need to know how it works under the hood to use it successfully.awaitdoes is allow you to step off your thread of execution and do some work. In a web app, you should really only beawaiting I/O operations, but, async and await allow you to do those operations away from the request's thread.