Asynchronous calls are a way to increase the scalability of your application. Normally, the thread that handles the request is blocked while it is being processed, meaning that this thread will be unavailable to accept other requests. By using asynchronous actions, another thread from a different pool is assigned the request, and the listening thread is returned to the pool, waiting to receive other requests. Controllers, Razor pages, tag helpers, view components, and middleware classes can perform asynchronously. Whenever you have operations that perform input/output (IO), always use asynchronous calls, as this can result in much better scalability.
For controllers, just change the signature of the action method to be like the following (note the async keyword and the Task<IActionResult> return type):
public async Task<IActionResult> Index() { ... }
In Razor Pages, it is similar (note the Async suffix, the Task<...