WPF的APP生命周期以及全局异常捕获

简介: WPF的APP生命周期以及全局异常捕获,详细介绍了整个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")]

publicstaticvoidMain() {

   WpfApp.Appapp=newWpfApp.App();

   app.InitializeComponent();//初始化Xaml

   app.Run();//程序运行

}

APP类继承自Application,常见的生命周期事件有以下几个:

  • Startup:在调用 Application 对象的 Run 方法时发生
  • Navigating:在应用程序中的导航器请求新导航时发生(针对Browser类型的应用)
  • LoadCompleted:在已经加载、分析并开始呈现应用程序中的导航器导航到的内容时发生
  • Navigated:在已经找到应用程序中的导航器要导航到的内容时发生,尽管此时该内容可能尚未完成加载
  • NavigationFailed:在应用程序中的导航器在导航到所请求内容时出现错误的情况下发生
  • NavigationProgress:在由应用程序中的导航器管理的下载过程中定期发生,以提供导航进度信息
  • NavigationStopped:在调用应用程序中的导航器的 StopLoading 方法时发生,或者当导航器在当前导航正在进行期间请求了一个新导航时发生
  • SessionEnding:在用户通过注销或关闭操作系统而结束 Windows 会话时发生
  • Activated:当应用程序成为前台应用程序时发生,App任意一个窗口激活
  • Deactivated:当应用程序停止作为前台应用程序时发生,App中所有窗口非激活
  • Exit:在应用程序关闭之前发生(无法像SessionEnding事件进行取消)

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

-----App_Startup

-----App_Navigating

-----App_Activated

-----App_Exit

窗体生命周期事件

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

  • SourceInitialized:操作系统给窗口分配句柄的时候触发,注意WPF窗体里面的控件是没有句柄的
  • ContentRendered:窗体内容渲染后触发
  • Loaded:窗体布局加载完成即准备好交互后触发
  • Activated:窗体激活
  • Deactivated:窗体失去焦点
  • Closing:调用关闭窗体时触发,此时可以取消操作
  • Closed:窗体关闭后

全局异常捕获

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

  • DispatcherUnhandledException:在异常由应用程序引发但未进行处理时发生针对UI线程,无法捕获多线程异常
  • AppDomain.CurrentDomain.UnhandledException:专门捕获所有线程中的异常
  • TaskScheduler.UnobservedTaskException:专门捕获Task异常

案例:

APP中进行全局异常捕获

publicpartialclassApp : Application

{

   publicApp()

   {

       //在异常由应用程序引发但未进行处理时发生。UI线程

       //无法捕获多线程异常

       this.DispatcherUnhandledException+=App_DispatcherUnhandledException;

       //专门捕获所有线程中的异常

       AppDomain.CurrentDomain.UnhandledException+=CurrentDomain_UnhandledException;

       //专门捕获Task异常

       TaskScheduler.UnobservedTaskException+=TaskScheduler_UnobservedTaskException;

   }

   privatevoidApp_DispatcherUnhandledException(objectsender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgse)

   {

       Debug.WriteLine("-----App_DispatcherUnhandledException--UI线程"+e.Exception.Message);

   }

   privatevoidCurrentDomain_UnhandledException(objectsender, UnhandledExceptionEventArgse)

   {

       Debug.WriteLine("-----CurrentDomain_UnhandledException--其他线程"+ (e.ExceptionObjectasException).Message);

   }

   privatevoidTaskScheduler_UnobservedTaskException(object?sender, UnobservedTaskExceptionEventArgse)

   {

       Debug.WriteLine("-----TaskScheduler_UnobservedTaskException--Task测试"+e.Exception.Message);

       e.SetObserved();

   }

}

窗体中抛异常

publicpartialclassMainWindow : Window

{

   inti=0;

   publicMainWindow()

   {

       InitializeComponent();

       //1、ui线程异常测试

       _=1/i;

 

       //2、其他线程异常测试

       newThread(newThreadStart(() => { _=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();


相关文章
|
开发框架 JavaScript 小程序
vue,小程序,uni-app的生命周期?
vue,小程序,uni-app的生命周期?
【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 异常分析
【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 异常分析
242 2
【Azure Function】Function App出现System.IO.FileNotFoundException异常
Exception while executing function: xxxxxxx,The type initializer for 'xxxxxx.Storage.Adls2.StoreDataLakeGen2Reading' threw an exception. Could not load file or assembly 'Microsoft.Extensions.Configuration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the
352 64
|
Linux 开发工具 数据安全/隐私保护
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
这篇文章介绍了在CentOS 7系统中安装Docker时遇到的两个常见问题及其解决方法:用户不在sudoers文件中导致权限不足,以及yum被锁定的问题。
338 2
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
|
JavaScript Linux 数据中心
【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异常
【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异常
191 3
【Azure Function App】解决Function App For Container 遇见ServiceUnavailable的异常
【Azure 应用服务】在App Service中调用外部服务API时需要携带客户端证书,而多次调用的情况下会出现WindowsCryptographicException Keyset does not exist异常
【Azure 应用服务】在App Service中调用外部服务API时需要携带客户端证书,而多次调用的情况下会出现WindowsCryptographicException Keyset does not exist异常
272 0
|
C# 开发工具
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
196 0
|
iOS开发
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
319 1
|
小程序
深入理解 uni-app 页面生命周期(四)onShareAppMessage
深入理解 uni-app 页面生命周期(四)onShareAppMessage
2024 0
深入理解 uni-app 页面生命周期(三):onHide vs onUnload
深入理解 uni-app 页面生命周期(三):onHide vs onUnload
1510 0

热门文章

最新文章