ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

类库使用ConfigureAwait.Fody配置全局ConfigureAwait (false)取消异步上下文切换提高性能(FodyWeavers.xml文件)

2022-03-05 08:31:06  阅读:177  来源: 互联网

标签:类库 异步 Task Fody ConfigureAwait false 上下文


类库使用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

标签:类库,异步,Task,Fody,ConfigureAwait,false,上下文
来源: https://www.cnblogs.com/51net/p/15966958.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有