单个async方法中多次ConfigureAwait(false)的作用及上下文疑问
关于async方法中ConfigureAwait(false)对后续await上下文的影响
咱们先把ConfigureAwait(false)的核心作用说透:它的本质是告诉await关键字——等异步操作完成后,不用费心恢复到之前的原始上下文(比如UI线程上下文、ASP.NET的请求上下文),直接在线程池的线程上继续执行后续代码就行。
回到你的代码流程:
- 一开始
SomeMethodAsync在原始上下文里跑(注释1处) - 当你执行
await Method1Async().ConfigureAwait(false)后,异步操作完成时,代码会直接切换到线程池线程上继续(注释2处),完全和原始上下文脱钩了 - 接下来你调用
await Method2(),这里虽然没加ConfigureAwait(false),但要注意:await恢复上下文的时候,只会恢复到当前执行代码所在的上下文。而此时你已经在无特殊上下文的线程池线程里了,所以Method2()完成后,后续的注释3处代码,依然会在线程池线程上执行,不会回到原始上下文。
简单总结:一旦你用了一次ConfigureAwait(false)跳出原始上下文,后续的await哪怕不加这个配置,也没法回到最初的原始上下文了——因为当前的上下文已经变成线程池的通用上下文了。
内容的提问来源于stack exchange,提问作者jon smith
相关产品推荐
相关产品推荐

