1. 程式人生 > 其它 >類庫使用ConfigureAwait.Fody配置全域性ConfigureAwait (false)取消非同步上下文切換提高效能(FodyWeavers.xml檔案)

類庫使用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

【微信公眾號】:http://dwz.cn/ABenNET