欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解WPF中的APP生命周期以及全局異常捕獲

 更新時間:2023年03月02日 14:12:26   作者:步、步、為營  
這篇文章主要為大家詳細(xì)介紹了WPF中的APP生命周期以及全局異常捕獲的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)WPF有一點的幫助,需要的可以了解一下

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)文章

最新評論