单独在await语句行编写ConfigureAwait(false)是否具有实际意义?
结论
你给出的示例中这么写ConfigureAwait(false)没有任何实际意义。
原因说明
ConfigureAwait(false)的核心作用,是指定当前await语句执行完成后,后续的剩余代码不需要切回之前捕获的同步上下文(比如UI线程、ASP.NET请求上下文等)。而你的示例代码里,带ConfigureAwait(false)的await语句已经是方法的最后一行,后面没有任何需要执行的尾部代码,自然不存在可以作用的对象,写了也不会产生任何效果。
private async Task test() { await Task.Run(() =>{}).ConfigureAwait(false); // 此处无后续代码,ConfigureAwait(false)没有生效的目标 }
正常生效的场景示例
只有当await语句后还有需要执行的代码时,ConfigureAwait(false)才会起作用,效果如下:
async Task MyMethodAsync() { // 这里的代码运行在原始上下文 await Task.Delay(1000); // 这里的代码依然运行在原始上下文 await Task.Delay(1000).ConfigureAwait(continueOnCapturedContext: false); // 这里开始的代码不会再回到原始上下文,默认运行在线程池上,正是ConfigureAwait(false)的作用效果 }
补充建议
如果你的方法后续没有扩展计划,末尾的await完全没必要加ConfigureAwait(false);如果是类库的公共方法,不确定后续会不会加代码,也可以保留,不会有额外的性能损耗。
内容的提问来源于stack exchange,提问作者Peter Chegrinec
相关产品推荐
相关产品推荐

