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

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

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

APP生命周期

wpf項(xiàng)目目錄中有一個(gè)App.xaml.cs文件,該文件中App是一個(gè)partical類,與之對(duì)應(yīng)的另一partical部分在App.g.i.cs文件中,該文件是在編譯的時(shí)候WPF自動(dòng)生成的。程序的入口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();//程序運(yùn)行
}

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

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

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

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

窗體生命周期事件

在APP運(yùn)行后,會(huì)啟動(dòng)窗體,窗體常用的聲明周期事件如下:

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

全局異常捕獲

對(duì)于異常捕獲一般使用try-catch語(yǔ)句進(jìn)行捕獲,但是對(duì)于全局的異常可以在App中進(jìn)行捕獲。

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

案例:

APP中進(jìn)行全局異常捕獲

public partial class App : Application
{
    public App()
    {
        //在異常由應(yīng)用程序引發(fā)但未進(jìn)行處理時(shí)發(fā)生。UI線程
        //無(wú)法捕獲多線程異常
        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測(cè)試" + e.Exception.Message);
        e.SetObserved();
    }
}

窗體中拋異常

public partial class MainWindow : Window
{
    int i = 0;
    public MainWindow()
    {
        InitializeComponent();
        //1、ui線程異常測(cè)試
        _ = 1 / i;

        //2、其他線程異常測(cè)試
        new Thread(new ThreadStart(() => { _ = 1 / i; })).Start();

        //3、Task異常測(cè)試
        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測(cè)試只有TaskScheduler.UnobservedTaskException可以捕獲到Task異常

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

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

相關(guān)文章

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

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

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

    細(xì)說C#中的枚舉:轉(zhuǎn)換、標(biāo)志和屬性

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

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

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

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

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

    C# XML中的轉(zhuǎn)義字符操作

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

    C#中比較常用的DateTime結(jié)構(gòu)的使用方法

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

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

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

    詳解c# 多態(tài)

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

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

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

    利用C#編寫Linux守護(hù)進(jìn)程實(shí)例代碼

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

最新評(píng)論

海阳市| 滕州市| 姜堰市| 吉林省| 宁阳县| 沅陵县| 宽甸| 山丹县| 桃源县| 钦州市| 陵水| 十堰市| 海原县| 巴彦县| 阜城县| 永和县| 台中市| 沂南县| 兰考县| 高淳县| 梁山县| 滕州市| 青岛市| 修文县| 色达县| 长治县| 延安市| 济源市| 浑源县| 喜德县| 新密市| 游戏| 丹巴县| 宜阳县| 甘德县| 峨眉山市| 新野县| 雷州市| 和硕县| 七台河市| 乐业县|