《C#併發編程經典實例》學習筆記—2.9 處理 async void 方法的異常

問題

需要處理從 async void 方法傳遞出來的異常。

解決方案

書中建議儘量不寫 async void 這樣的方法,如果非寫不可,建議在方法內部 try catch 所有的代碼,即在方法內部處理好所有可能的異常。

當然處理 async void 方法的異常,還有一個辦法,即全局異常處理方法中進行異常處理,當然這個辦法算不是辦法的辦法。全局異常處理可以處理 async void 方法的異常,是因爲當異常從 async void 方法拋出的時候,可以在 SynchronizationContext Class (System.Threading) | Microsoft Docs 引發出來。前提是當前平臺支持SynchronizationContext。

SynchronizationContext 適用於

.NET Core
3.0 2.2 2.1 2.0 1.1 1.0
.NET Framework
4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6 4.5.2 4.5.1 4.5 4.0 3.5 3.0 2.0
.NET Standard
2.1 2.0 1.6 1.4 1.3 1.2 1.1 1.0
UWP
10.0
Xamarin.Android
7.1
Xamarin.iOS
10.8
Xamarin.Mac
3.0

全局處理異常機制:WPF 有 Application.DispatcherUnhandledException ,WinRT有 Application.UnhandledException ,ASP.NET 有 Application_Error ,Asp.NET Core可以添加異常過濾器,自己實現的全局異常過濾器需繼承接口 IExceptionFilter ,或者添加異常處理中間件。

在不支持的平臺需要自己操作SynchronizationContext進行 async void 的異常處理,可以藉助已有的處理方案,即免費的 NuGet 庫 Nito.AsyncEx 。

作者給出的示例代碼,藉助AsyncContext對異常進行處理。AsyncContext封裝了對SynchronizationContext的操作,源碼參考 AsyncEx/AsyncContext.TaskScheduler.cs at master · StephenCleary/AsyncEx

static class Program
{
    static int Main(string[] args)
    {
        try
        {
            return AsyncContext.Run(() => MainAsync(args));
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex);
            return -1;
        }
    }
    static async void MainAsync(string[] args)
    {
        //...
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章