类库使用ConfigureAwait.Fody配置全局ConfigureAwait (false)取消异步上下文切换提高性能(FodyWeavers.xml文件)
类库使用ConfigureAwait.Fody配置全局ConfigureAwait (false)取消异步上下文切换 - 唐 森 - 博客园
https://www.cnblogs.com/townsend/p/13748954.html
在.net中(包括.net core和.net framework)异步任务默认的会带有一个上下文关联的一个状态机,也就是配置的ConfigureAwait为ture,微软官方文档解释为:尝试将延续任务封送回原始上下文
譬如一个异步方法:
async Task MethodWithContextAsync () {
await Task.Delay (TimeSpan.FromSeconds (1));
// 默认会获取一个上下文(上下文会获取一个调度者,没有则从线程池中获取),并在该上下文中回调,
}
默认的方法等同于
async Task MethodWithContextAsync () {
await Task.Delay (TimeSpan.FromSeconds (1)).ConfigureAwait(true);
// 等同与没加.ConfigureAwait方法
}
如果只是在类库中使用异步方法,则可以加.ConfigureAwait(false);
async Task MethodWithoutContextAsync () {
await Task.Delay (TimeSpan.FromSeconds (1)).ConfigureAwait(false);
// 去掉掉任务的上下文,没有了上下文对象的开销,也就能提高性能
}
如果每一个异步方法调用都加上ConfigureAwait(false)则改动比较大,这时候就可以利用ConfigureAwait.Fody来做全局配置,
编译后的就会在项目里的每一个异步调用后面加上ConfigureAwait(false),相当于AOP静态织入。
添加nuget包:
PM> Install-Package Fody
PM> Install-Package ConfigureAwait.Fody
然后在VS项目中右键生成,会看到多了一个FodyWeavers.xml文件
默认是没有设置ConfigureAwait(false),需要在FodyWeavers.xml的ConfigureAwait节点添加 ContinueOnCapturedContext="false"
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>
使用ILSpy反编译下程序集生成的dll,可以看到ConfigureAwait.Fody已经在编译期间自动在异步方法调用后面加上了.ConfigureAwait(continueOnCapturedContext: false)
ConfigureAwait相关参考资料:
https://www.cnblogs.com/xiaoxiaotank/p/13529413.html
https://www.cnblogs.com/AlienXu/archive/2019/07/12/11177434.html
https://github.com/Fody/ConfigureAwait
作者:阿笨
【官方QQ一群:跟着阿笨一起玩NET(已满)】:422315558
【官方QQ二群:跟着阿笨一起玩C#(已满)】:574187616
【官方QQ三群:跟着阿笨一起玩ASP.NET(已满)】:967920586
【官方QQ四群:Asp.Net Core跨平台技术开发(可加入)】:829227829
【官方QQ五群:.NET Core跨平台开发技术(可加入)】:647639415
【网易云课堂】:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628
【腾讯课堂】:https://abennet.ke.qq.com
【51CTO学院】:https://edu.51cto.com/sd/66c64
【微信公众号】:微信搜索:跟着阿笨一起玩NET