c#多线程异步await不会阻塞线程

await 会从线程池中另起一个线程来执行任务,而线程池的管理是交由我们的Task去控制的

为啥又是await跟task纠结的

async/await----------------这才是一对啊。

异步IO和等待,他只是启动了一个异步IO动作,等待系统IO管理器异步完成IO,等完成IO以后通知从线程池里挑选一个状态为Complate的线程执行回调动作

那么假设是某园子吹的IOCP,他等待的是网络IO,他不启动线程,他只是发起了一个 windows IOCP 的IRQ请求,等这个异步请求执行完毕,系统通过软中断唤醒,然后他在从线程池里调个空闲线程把消息回调给你

当然 如果你是 await Task.Run(),这类才算启动了一个线程

总结:异步不必线程(如果是驱动级异步IO无需线程),线程不必异步(如果你不需要去拿结果,那么你大可以不必管他,他执行完毕线程自然消亡)

另外:池和本题毫无关系,池是背压控制手段。因为手上一旦有锤子,看啥都是钉子。所以设计师们会强行约束你的行为,控制背压。不让你看啥都去线程,设计师得约束你进水,出水大致相当(小学题目,一管进水,一管出水,请问多长时间池子满/空,池的目的也就是如此,当你开始看啥都是线程的时候,官方就得提醒你池满了,请不要在放水了)

你可以理解为就是个Task.Run(),几乎一致,只不过async/await部分地方更有优势并且更简单