WPF中的APP生命周期及全局异常捕获源码分析

发布时间:2023-03-02 15:58:21 作者:iii
来源:亿速云 阅读:88

这篇文章主要讲解了“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,常见的生命周期事件有以下几个:

对于普通窗体程序,从开始到结束会依次调用如下事件

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

窗体生命周期事件

在APP运行后,会启动窗体,窗体常用的声明周期事件如下:

全局异常捕获

对于异常捕获一般使用try-catch语句进行捕获,但是对于全局的异常可以在App中进行捕获。

案例:

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生命周期及全局异常捕获源码分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. WPF中怎么自定义MenuItem样式
  2. WPF中怎么自定义ProgressBar滚动条样式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

wpf app

上一篇:python中的循环结构问题如何解决

下一篇:WPF中鼠标/键盘/拖拽事件及用行为封装事件的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》