It would be helpful to understand the theoretical difference between Await and async . They are known as blocking and non-blocking, respectively.
Lock
Computing a lock is very similar to a while .
while(!done) { if (isDone) { // do whatever done = true } }
This is a synchronous lock calculation. Thread cannot do anything until the lock action is complete, because it constantly checks the action.
You actually have as many threads as there are processors on the machine. We hope you can see how quickly they can be fully occupied, and a giant FIFO queue of "things to do."
Non blocking
In fact, the concept is very simple. Instead of constantly checking that something has been done, the check is performed at specified time intervals. Future will be checked for completion every 100 ms (say).
The amazing thing is that during each of these 100 ms breaks, Thread is free to do something else. That is why you get superior performance from async things.
Bottom row
It is physically possible for processors to do more things in a given amount of time. This is a very simple syllogism.
Say that you and your friend decided to meet for coffee at 3 pm. He does not appear.
You can sit in a cafe cursing relentlessly, or you can go home and bake cookies. While the cookie is baking, you check your phone every 5 minutes, until it finally texts, and then you meet.
In Scenario 1, you get angry and havenβt done much all day.
In Scenario 2, you are delighted with your culinary success and in a great mood to see a friend.