最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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:在調(diào)用 Application 對象的 Run 方法時發(fā)生
  • Navigating:在應用程序中的導航器請求新導航時發(fā)生(針對Browser類型的應用)
  • LoadCompleted:在已經(jīng)加載、分析并開始呈現(xiàn)應用程序中的導航器導航到的內(nèi)容時發(fā)生
  • Navigated:在已經(jīng)找到應用程序中的導航器要導航到的內(nèi)容時發(fā)生,盡管此時該內(nèi)容可能尚未完成加載
  • NavigationFailed:在應用程序中的導航器在導航到所請求內(nèi)容時出現(xiàn)錯誤的情況下發(fā)生
  • NavigationProgress:在由應用程序中的導航器管理的下載過程中定期發(fā)生,以提供導航進度信息
  • NavigationStopped:在調(diào)用應用程序中的導航器的 StopLoading 方法時發(fā)生,或者當導航器在當前導航正在進行期間請求了一個新導航時發(fā)生
  • SessionEnding:在用戶通過注銷或關閉操作系統(tǒng)而結束 Windows 會話時發(fā)生
  • Activated:當應用程序成為前臺應用程序時發(fā)生,App任意一個窗口激活
  • Deactivated:當應用程序停止作為前臺應用程序時發(fā)生,App中所有窗口非激活
  • Exit:在應用程序關閉之前發(fā)生(無法像SessionEnding事件進行取消)

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

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

窗體生命周期事件

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

  • SourceInitialized:操作系統(tǒng)給窗口分配句柄的時候觸發(fā),注意WPF窗體里面的控件是沒有句柄的
  • ContentRendered:窗體內(nèi)容渲染后觸發(fā)
  • Loaded:窗體布局加載完成即準備好交互后觸發(fā)
  • Activated:窗體激活
  • Deactivated:窗體失去焦點
  • Closing:調(diào)用關閉窗體時觸發(fā),此時可以取消操作
  • Closed:窗體關閉后

全局異常捕獲

對于異常捕獲一般使用try-catch語句進行捕獲,但是對于全局的異??梢栽贏pp中進行捕獲。

  • DispatcherUnhandledException:在異常由應用程序引發(fā)但未進行處理時發(fā)生針對UI線程,無法捕獲多線程異常
  • AppDomain.CurrentDomain.UnhandledException:專門捕獲所有線程中的異常
  • TaskScheduler.UnobservedTaskException:專門捕獲Task異常

案例:

APP中進行全局異常捕獲

public partial class App : Application
{
    public App()
    {
        //在異常由應用程序引發(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;
        });
    }   
}
異常結果說明
只打開異常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();

到此這篇關于詳解WPF中的APP生命周期以及全局異常捕獲的文章就介紹到這了,更多相關WPF生命周期 全局異常捕獲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#基于Twain協(xié)議調(diào)用掃描儀,設置多圖像輸出模式(Multi image output)

    C#基于Twain協(xié)議調(diào)用掃描儀,設置多圖像輸出模式(Multi image output)

    這篇文章主要介紹了C#基于Twain協(xié)議調(diào)用掃描儀,設置多圖像輸出模式(Multi image output)的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • 細說C#中的枚舉:轉換、標志和屬性

    細說C#中的枚舉:轉換、標志和屬性

    枚舉是 C# 中最有意思的一部分,大部分開發(fā)人員只了解其中的一小部分,甚至網(wǎng)上絕大多數(shù)的教程也只講解了枚舉的一部分。那么,我將通過這篇文章向大家具體講解一下枚舉的知識,需要的朋友可以參考下
    2020-02-02
  • C#生成EMF矢量圖形文件示例詳解

    C#生成EMF矢量圖形文件示例詳解

    這篇文章主要為大家介紹了C#?生成?EMF矢量圖形文件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • c# 使用Json.NET實現(xiàn)json序列化

    c# 使用Json.NET實現(xiàn)json序列化

    這篇文章主要介紹了詳解C#中的JSON序列化方法,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-05-05
  • C# XML中的轉義字符操作

    C# XML中的轉義字符操作

    這篇文章主要介紹了C# XML中的轉義字符操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C#中比較常用的DateTime結構的使用方法

    C#中比較常用的DateTime結構的使用方法

    這篇文章主要介紹了C#中比較常用的DateTime結構的使用方法,需要的朋友可以參考下
    2015-11-11
  • 詳解Unity 實現(xiàn)語音識別功能

    詳解Unity 實現(xiàn)語音識別功能

    語言識別功能已經(jīng)在我們身邊普遍流行起來,在unity開發(fā)中語音識別也非常火熱,今天就介紹下Unity自帶的語音識別功能的實現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 詳解c# 多態(tài)

    詳解c# 多態(tài)

    這篇文章主要介紹了c# 多態(tài)的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式

    C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式

    這篇文章主要介紹了C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 利用C#編寫Linux守護進程實例代碼

    利用C#編寫Linux守護進程實例代碼

    如今的編程是一場程序員和上帝的競賽,程序員要開發(fā)出更大更好、傻瓜都會用到軟件,下面這篇文章主要給大家介紹了關于利用C#編寫Linux守護進程的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-01-01

最新評論

乌恰县| 绥阳县| 灵宝市| 永定县| 广宗县| 米脂县| 五大连池市| 虹口区| 西林县| 上饶县| 布拖县| 绥德县| 新竹县| 舒兰市| 林州市| 美姑县| 三穗县| 甘孜| 饶阳县| 珲春市| 林州市| 潮州市| 华亭县| 瓮安县| 徐闻县| 达州市| 潢川县| 东阿县| 亳州市| 姜堰市| 海伦市| 浦江县| 乌审旗| 聂拉木县| 临洮县| 绥宁县| 平顶山市| 富裕县| 泸定县| 建昌县| 沾益县|