[个人笔记][C#]异步调用控制流的一些测试结论

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