•
await releases the current thread while waiting; it does not start a new one
•
the compiler rewrites everything after each await into a continuation on a state machine
•
an async void method's exception cannot be awaited or caught by the caller; it crashes the process
•
the Task an async method returns is already running; awaiting only observes it
•
.Result or .Wait() on a captured context blocks the very thread the continuation needs
•
the captured context is what makes the continuation resume on the UI thread
•
declines to capture the context; the default choice inside a library
•
the exception is stored and rethrown at the await, not at the call
•
a Task that is never awaited can swallow its failure entirely
•
start both operations, then await, instead of awaiting each in turn
•
awaiting WhenAll surfaces only the first exception; the rest are on the returned Task
•
avoids an allocation on the usually-synchronous path, and may be awaited only once
•
cancellation is cooperative: the callee must observe the token or pass it further down
•
bridges a callback-based API into a Task, with RunContinuationsAsynchronously to avoid inline resumption