What actually happens when you `await` a `Task`?
The compiler rewrites the method into a state machine: code before the await runs synchronously, and if the task is not complete yet, the method hands control back to its caller and frees the thread instead of blocking it. The continuation resumes when the task completes, by default on the captured SynchronizationContext, which is why library code calls ConfigureAwait(false) to avoid deadlocks and unnecessary context switches.