- await调用逻辑总结如下:
- 调用线程A执行到await时,在await处返回并继续执行调用点后面的代码,await处新开一个线程B执行task
- 线程B执行完task后继续执行await后面的代码
- 如果再次遇到await,线程B在await处返回,新开一个线程C执行task
- 线程C执行完task后继续执行await后面的代码
- "新开一个线程"是指向线程池申请一个线程,至于是否重用线程还是创建全新线程取决于线程池的调度
- 如果主函数是异步方法,在主函数写await的话,在await处主线程会结束并回到线程池,await完成之后可能会是另一个线程来执行主函数的后续部分,也就和上面的逻辑保持一致了,主线程并不特殊,只是一个线程池线程而已
- 如果用
task.Result
的话,该线程会阻塞等待执行结果,不会回到线程池