其实你的问题可以简化为一句话,await是如何不阻塞线程来进行异步的?
答案是await不一定不阻塞线程,要看具体实现,像下面这样显然是掩耳盗铃
await Task.Run(...
当然,当前线程的确不被阻塞了,如果当前线程是UI线程什么的,这样写还是有意义的。
但是,.NET Framework绝大多数Async结尾的方法都是非阻塞式异步的,原理也非常简单,基于回调就可以不必阻塞线程。