Despite its name, await does not actually work like Thread.Join. async and await are Microsoft's implementation of coroutines implemented using a continuation transition style. Work is reordered, so processing can continue while Task<T> is running. The compiler reinstalls the instructions to make the most of the asynchronous operation.
This article explains this as follows:
the wait expression does not block the thread on which it is running. Instead, it forces the compiler to sign the rest of the asynchronous method as a continuation of the expected task. The control then returns to the caller of the async method. When the task completes, it invokes its continuation, and the async method resumes where it left off.
For some simple code examples, await doesn't really make much sense, because there is no other work that you can do at the same time while you wait.
source share