詳解WPF中的APP生命周期以及全局異常捕獲
APP生命周期
wpf項目目錄中有一個App.xaml.cs文件,該文件中App是一個partical類,與之對應(yīng)的另一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
:在調(diào)用 Application 對象的 Run 方法時發(fā)生Navigating
:在應(yīng)用程序中的導(dǎo)航器請求新導(dǎo)航時發(fā)生(針對Browser類型的應(yīng)用)LoadCompleted
:在已經(jīng)加載、分析并開始呈現(xiàn)應(yīng)用程序中的導(dǎo)航器導(dǎo)航到的內(nèi)容時發(fā)生Navigated
:在已經(jīng)找到應(yīng)用程序中的導(dǎo)航器要導(dǎo)航到的內(nèi)容時發(fā)生,盡管此時該內(nèi)容可能尚未完成加載NavigationFailed
:在應(yīng)用程序中的導(dǎo)航器在導(dǎo)航到所請求內(nèi)容時出現(xiàn)錯誤的情況下發(fā)生NavigationProgress
:在由應(yīng)用程序中的導(dǎo)航器管理的下載過程中定期發(fā)生,以提供導(dǎo)航進度信息NavigationStopped
:在調(diào)用應(yīng)用程序中的導(dǎo)航器的 StopLoading 方法時發(fā)生,或者當(dāng)導(dǎo)航器在當(dāng)前導(dǎo)航正在進行期間請求了一個新導(dǎo)航時發(fā)生SessionEnding
:在用戶通過注銷或關(guān)閉操作系統(tǒng)而結(jié)束 Windows 會話時發(fā)生Activated
:當(dāng)應(yīng)用程序成為前臺應(yīng)用程序時發(fā)生,App任意一個窗口激活Deactivated
:當(dāng)應(yīng)用程序停止作為前臺應(yīng)用程序時發(fā)生,App中所有窗口非激活Exit
:在應(yīng)用程序關(guān)閉之前發(fā)生(無法像SessionEnding事件進行取消)
對于普通窗體程序,從開始到結(jié)束會依次調(diào)用如下事件
-----App_Startup
-----App_Navigating
-----App_Activated
-----App_Exit
窗體生命周期事件
在APP運行后,會啟動窗體,窗體常用的聲明周期事件如下:
SourceInitialized
:操作系統(tǒng)給窗口分配句柄的時候觸發(fā),注意WPF窗體里面的控件是沒有句柄的ContentRendered
:窗體內(nèi)容渲染后觸發(fā)Loaded
:窗體布局加載完成即準(zhǔn)備好交互后觸發(fā)Activated
:窗體激活Deactivated
:窗體失去焦點Closing
:調(diào)用關(guān)閉窗體時觸發(fā),此時可以取消操作Closed
:窗體關(guān)閉后
全局異常捕獲
對于異常捕獲一般使用try-catch語句進行捕獲,但是對于全局的異??梢栽贏pp中進行捕獲。
DispatcherUnhandledException
:在異常由應(yīng)用程序引發(fā)但未進行處理時發(fā)生針對UI線程,無法捕獲多線程異常AppDomain.CurrentDomain.UnhandledException
:專門捕獲所有線程中的異常TaskScheduler.UnobservedTaskException
:專門捕獲Task異常
案例:
APP中進行全局異常捕獲
public partial class App : Application { public App() { //在異常由應(yīng)用程序引發(fā)但未進行處理時發(fā)生。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; }); } }
異常 | 結(jié)果 | 說明 |
---|---|---|
只打開異常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中的異常并不是立刻就能捕獲到的,而是等到垃圾回收的時候進行捕獲。如果想立刻進行捕獲則可以調(diào)用GC.Collect(0);
和GC.WaitForPendingFinalizers();
到此這篇關(guān)于詳解WPF中的APP生命周期以及全局異常捕獲的文章就介紹到這了,更多相關(guān)WPF生命周期 全局異常捕獲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
同步調(diào)用和異步調(diào)用WebService
本文給大家介紹webservice同步調(diào)用和異步調(diào)用,同步調(diào)用就是一個同步操作會阻塞整個當(dāng)前的進程,直到這個操作完成才能執(zhí)行下一段代碼,異步調(diào)用不會阻塞啟動操作的調(diào)用線程,調(diào)用程序必須通過輪流檢測,或者等待完成信號來發(fā)現(xiàn)調(diào)用的完成。小伙伴們跟著小編一起學(xué)習(xí)2015-09-09C#中數(shù)組、ArrayList和List三者的區(qū)別詳解及實例
這篇文章主要介紹了C#中數(shù)組、ArrayList和List三者的區(qū)別詳解及實例的相關(guān)資料,需要的朋友可以參考下2016-12-12基于C#實現(xiàn)Windows服務(wù)狀態(tài)啟動和停止服務(wù)的方法
這篇文章主要介紹了基于C#實現(xiàn)Windows服務(wù)狀態(tài)啟動和停止服務(wù)的方法,詳細(xì)講述了實現(xiàn)這一功能的具體步驟,代碼簡潔易懂,需要的朋友可以參考下2014-09-09