await operator suspends evaluation of the enclosing async method until the asynchronous operation represented by its operand completes. When the asynchronous operation completes, the
await operator returns the result of the operation, if any. When the
await operator is applied to the operand that represents already completed operation, it returns the result of the operation immediately without suspension of the enclosing method. The
await operator doesn’t block the thread that evaluates the async method. When the
await operator suspends the enclosing async method, the control returns to the caller of the method.
GetValue(2): Starting GetValue(2): Begin await at 0.01 seconds GetValue(3): Starting GetValue(3): Begin await at 0.00 seconds GetValue(2): End await at 2.01 seconds Return: 2 GetValue(3): End await at 3.00 seconds Return: 3