Understanding async/await is the difference between an app that supports 5,000 users and one that crashes with only 50 users due to thread exhaustion.
When you call .Result or .Wait() on an async task, you are holding onto a thread while it waits. Under load, your **Thread Pool** will run out of available threads because everyone is waiting—this is Thread Starvation.
For any architect, the rule is simple: if one method in the chain is async, **EVERY** method from the Controller down to the Database must be async.
In Library/Backend code, always use .ConfigureAwait(false). This tells the system: "I don't need to return to the original SynchronizationContext." This prevents deadlocks in legacy code and boosts performance by reducing context switching.