ConfigureAwait(false) 原理以及注意事项总结
解决什么问题?
1、避免线程死锁
2、可能的性能提升
存在的问题:
1、当代码在另一个线程上继续时,线程同步上下文将丢失,因为状态机改变。这里最大的损失是你会失去归属于线程的Culture和Language,其中包含了国家语言时区信息,以及来自原始线程的HttpContext.Current之类的信息。
因此,如果您不需要以此来做多语系或操作任何HttpContext类型设置,则可以安全地进行此方法的调用。注意:如果需要language/culture,可以始终在await之前存储当前相关状态值,然后在await新线程之后重新应用它。
2、项目如果是 Net Framework 以及Net stadard 平台,建议使用ConfigureAwait(false),或者是说需要兼容这两个平台的类库建议使用;如果是只使用Net Core的项目,则可以不使用,在NetCore中移除了SynchronizationContext。
参考文章:
1、https://www.cnblogs.com/xiaoxiaotank/p/13529413.html【理解C#中的ConfigureAwait】
2、https://zhuanlan.zhihu.com/p/552387337?utm_id=0【Async,Await和ConfigureAwait的关系】
3、https://zhuanlan.zhihu.com/p/376704108【ASP.NET Core为什么移除了SynchronizationContext】
4、https://blog.csdn.net/WPwalter/article/details/79673214【在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁】