Async/Await嵌套调用疑问:已await任务内await时外层是否继续执行?
Async/Await嵌套场景的执行逻辑解答
先直接给结论:当SecondAsync执行await ThirdAsync()时,FirstAsync不会继续执行后续的doSomething(),具体执行流程可以拆解成以下步骤:
你的代码示例:
public async Task FirstAsync() { await SecondAsync(); // ... doSomething(); } public async Task SecondAsync() { await ThirdAsync(); // ... doSomething(); }
执行流程拆解
- 当
FirstAsync运行到await SecondAsync()时,会立即进入SecondAsync方法执行代码。 - 直到
SecondAsync遇到await ThirdAsync():- 如果
ThirdAsync是未完成的异步操作(比如IO请求、延迟任务),await会让SecondAsync立刻返回一个未完成的Task给FirstAsync的await语句。 - 此时
FirstAsync里的await会暂停整个FirstAsync的执行,把控制权交还给调用FirstAsync的上层上下文,不会继续执行后面的doSomething()。
- 如果
- 等
ThirdAsync完成后,程序回到SecondAsync暂停的位置,继续执行SecondAsync里await ThirdAsync()之后的代码,直到SecondAsync全部执行完毕,返回一个已完成的Task。 - 这时
FirstAsync里的await SecondAsync()才会恢复执行,继续运行后续的doSomething()。
简单来说,嵌套的await是层层暂停的,只有下层的异步任务全部完成,上层的方法才会继续往下走。
内容的提问来源于stack exchange,提问作者brandon disseldorp
相关产品推荐
相关产品推荐

