ConfigureAwait(false)
from:https://www.cnblogs.com/zzqvq/p/10252746.html
昨天在做项目的时候,用的dapper查数据用的QueryAsync 异步方法。给上级做代码审核时,上级说最好加上ConfigureAwait(false)
.能减少一些性能开销。
因为之前没用过所以看了 clr via c# 26 27章,以及参考网上资料。这里打算做个总结,什么情况下该使用这个。什么时候不使用这个
var title=await GetTitleAsync(5).ConfigureAwait(false);
1|0ConfigureAwait(true) 和 ConfigureAwait(false)的区别
一个是在异步执行时捕获上下文,一个是在异步执行时不捕获上下文.
1.当ConfigureAwait(true),代码由同步执行进入异步执行时,当前同步执行的线程上下文信息(比如HttpConext.Current,Thread.CurrentThread.CurrentCulture)就会被捕获并保存至SynchronizationContext中,供异步执行中使用,并且供异步执行完成之后(await之后的代码)的同步执行中使用(虽然await之后是同步执行的,但是发生了线程切换,会在另外一个线程中执行「ASP.NET场景」)。这个捕获当然是有代价的,当时我们误以为性能问题是这个地方的开销引起,但实际上这个开销很小,在我们的应用场景不至于会带来性能问题。
2.当Configurewait(flase),则不进行线程上下文信息的捕获,async方法中与await之后的代码执行时就无法获取await之前的线程的上下文信息,在ASP.NET中最直接的影响就是HttpConext.Current的值为null。
2|0什么时候该使用?
综上所述,如果你的异步方法,以及异步后的方法不涉及上下文操作,即加上ConfigureAwait(false)
,这样可以减少性能开销.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)