处理从 WPF 应用程序动态加载的组件的后台线程中的异常

本文关键字:组件 后台 异常 线程 加载 WPF 应用程序 动态 处理 | 更新日期: 2023-09-27 18:34:07

我的应用程序是由父 WPF 应用程序动态加载的程序集。我从我的组件处理 AppDomain.UnhandledException,以处理从任何后台线程引发的异常。

但是,由于父应用程序

也注册了同一事件,因此未处理的异常似乎也会传播到父应用程序。

是否有任何可以防止未经处理的异常不传播到我的父应用程序。

我将无法更改父应用程序行为,因为这可能会影响父应用程序内运行的其他组件。

谢谢

处理从 WPF 应用程序动态加载的组件的后台线程中的异常

像这样给出事件处理程序的显式名称

您的命名空间是 MyCompany.MyProduct.Service父级的命名空间是 MyCompany.MyProduct.Parent

而不是使用

AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException(Myhandler);

使用以下

AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException(MyCompany.MyProduct.Service.MyHandler);

我希望问题能得到解决。

只需阅读 MSDN 的文档,

如果在默认应用程序域中处理 UnhandledException 事件,则无论线程在哪个应用程序域中启动,都会针对任何线程中的任何未处理异常引发该事件。如果线程在具有 UnhandledException 事件处理程序的应用程序域中启动,则会在该应用程序域中引发该事件。如果该应用程序域不是默认应用程序域,并且默认应用程序域中还有一个事件处理程序,则会在两个应用程序域中引发该事件。

例如,假设线程在应用程序域"AD1"中启动,调用应用程序域"AD2"中的方法,

然后从那里调用应用程序域"AD3"中的方法,并在其中引发异常。可以在其中引发 UnhandledException 事件的第一个应用程序域是"AD1"。如果该应用程序域不是默认应用程序域,则也可以在默认应用程序域中引发该事件。

因此,解决方案是为我的组件创建一个单独的域,并为我的域创建事件处理程序

  AppDomain domain = AppDomain.CreateDomain("MyDomain");
  domain.UnhandledException += MyDomainUnhandledException
  static void CurrentDomainUnhandledException(objectsender,UnhandledExceptionEventArgs e) 
  {
   //Exception handling logic for my domain
  }

这将确保异常不会传播到父应用程序