Start here. This is the direct spoken answer to practice first.
Why this question matters
An async method preserves normal-looking control flow by storing enough state to pause at an incomplete await and continue after the operation finishes. That mechanism explains exception timing, object lifetime across awaits, and the cost of large numbers of pending operations.
When an async method reaches an await, it first checks whether the awaited operation is already complete. If not, the method stores the state it needs later and returns an incomplete Task to its caller instead of blocking the thread. When the operation completes, the continuation resumes from that point. If the awaited operation failed, its exception is observed at the await expression.