中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WPF中的APP生命周期及全局異常捕獲源碼分析

發布時間:2023-03-02 15:58:21 來源:億速云 閱讀:88 作者:iii 欄目:開發技術

這篇文章主要講解了“WPF中的APP生命周期及全局異常捕獲源碼分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“WPF中的APP生命周期及全局異常捕獲源碼分析”吧!

    APP生命周期

    wpf項目目錄中有一個App.xaml.cs文件,該文件中App是一個partical類,與之對應的另一partical部分在App.g.i.cs文件中,該文件是在編譯的時候WPF自動生成的。程序的入口Main方法在該文件中定義。

    [System.STAThreadAttribute()]
    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "7.0.1.0")]
    public static void Main() {
        WpfApp.App app = new WpfApp.App();
        app.InitializeComponent();//初始化Xaml
        app.Run();//程序運行
    }

    APP類繼承自Application,常見的生命周期事件有以下幾個:

    • Startup:在調用 Application 對象的 Run 方法時發生

    • Navigating:在應用程序中的導航器請求新導航時發生(針對Browser類型的應用)

    • LoadCompleted:在已經加載、分析并開始呈現應用程序中的導航器導航到的內容時發生

    • Navigated:在已經找到應用程序中的導航器要導航到的內容時發生,盡管此時該內容可能尚未完成加載

    • NavigationFailed:在應用程序中的導航器在導航到所請求內容時出現錯誤的情況下發生

    • NavigationProgress:在由應用程序中的導航器管理的下載過程中定期發生,以提供導航進度信息

    • NavigationStopped:在調用應用程序中的導航器的 StopLoading 方法時發生,或者當導航器在當前導航正在進行期間請求了一個新導航時發生

    • SessionEnding:在用戶通過注銷或關閉操作系統而結束 Windows 會話時發生

    • Activated:當應用程序成為前臺應用程序時發生,App任意一個窗口激活

    • Deactivated:當應用程序停止作為前臺應用程序時發生,App中所有窗口非激活

    • Exit:在應用程序關閉之前發生(無法像SessionEnding事件進行取消)

    對于普通窗體程序,從開始到結束會依次調用如下事件

    -----App_Startup
    -----App_Navigating
    -----App_Activated
    -----App_Exit

    窗體生命周期事件

    在APP運行后,會啟動窗體,窗體常用的聲明周期事件如下:

    • SourceInitialized:操作系統給窗口分配句柄的時候觸發,注意WPF窗體里面的控件是沒有句柄的

    • ContentRendered:窗體內容渲染后觸發

    • Loaded:窗體布局加載完成即準備好交互后觸發

    • Activated:窗體激活

    • Deactivated:窗體失去焦點

    • Closing:調用關閉窗體時觸發,此時可以取消操作

    • Closed:窗體關閉后

    全局異常捕獲

    對于異常捕獲一般使用try-catch語句進行捕獲,但是對于全局的異常可以在App中進行捕獲。

    • DispatcherUnhandledException:在異常由應用程序引發但未進行處理時發生針對UI線程,無法捕獲多線程異常

    • AppDomain.CurrentDomain.UnhandledException:專門捕獲所有線程中的異常

    • TaskScheduler.UnobservedTaskException:專門捕獲Task異常

    案例:

    APP中進行全局異常捕獲

    public partial class App : Application
    {
        public App()
        {
            //在異常由應用程序引發但未進行處理時發生。UI線程
            //無法捕獲多線程異常
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
            //專門捕獲所有線程中的異常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            //專門捕獲Task異常
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
        }
        private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            Debug.WriteLine("-----App_DispatcherUnhandledException--UI線程" + e.Exception.Message);
        }
        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Debug.WriteLine("-----CurrentDomain_UnhandledException--其他線程" + (e.ExceptionObject as Exception).Message);
        }
        private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
        {
            Debug.WriteLine("-----TaskScheduler_UnobservedTaskException--Task測試" + e.Exception.Message);
            e.SetObserved();
        }
    }

    窗體中拋異常

    public partial class MainWindow : Window
    {
        int i = 0;
        public MainWindow()
        {
            InitializeComponent();
            //1、ui線程異常測試
            _ = 1 / i;
    
            //2、其他線程異常測試
            new Thread(new ThreadStart(() => { _ = 1 / i; })).Start();
    
            //3、Task異常測試
            Task.Run(() =>
            {
                _ = 1 / i;
            });
        }   
    }
    異常結果說明
    只打開異常1-----App_DispatcherUnhandledException--UI線程-----CurrentDomain_UnhandledException--其他線程UI線程中的異常DispatcherUnhandledException和AppDomain.CurrentDomain.UnhandledException均能捕獲到
    只打開異常2-----CurrentDomain_UnhandledException--其他線程只有AppDomain.CurrentDomain.UnhandledException可以捕獲
    只打開異常3-----TaskScheduler_UnobservedTaskException--Task測試只有TaskScheduler.UnobservedTaskException可以捕獲到Task異常

    備注:Task中的異常并不是立刻就能捕獲到的,而是等到垃圾回收的時候進行捕獲。如果想立刻進行捕獲則可以調用GC.Collect(0);GC.WaitForPendingFinalizers();

    感謝各位的閱讀,以上就是“WPF中的APP生命周期及全局異常捕獲源碼分析”的內容了,經過本文的學習后,相信大家對WPF中的APP生命周期及全局異常捕獲源碼分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    乌什县| 方正县| 乾安县| 玉田县| 津南区| 合阳县| 西充县| 茂名市| 凌源市| 博罗县| 榆树市| 昌乐县| 永仁县| 汾西县| 德兴市| 南宁市| 黔西县| 思南县| 京山县| 盐边县| 陇川县| 陇南市| 图木舒克市| 南宫市| 突泉县| 赤城县| 屯门区| 岑巩县| 蒙山县| 当阳市| 东至县| 五峰| 柘城县| 南汇区| 南华县| 仁怀市| 西丰县| 遂平县| 武隆县| 喀喇| 凉城县|