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