处理从 WPF 应用程序动态加载的组件的后台线程中的异常
本文关键字:组件 后台 异常 线程 加载 WPF 应用程序 动态 处理 | 更新日期: 2023-09-27 18:34:07
我的应用程序是由父 WPF 应用程序动态加载的程序集。我从我的组件处理 AppDomain.UnhandledException,以处理从任何后台线程引发的异常。
但是,由于父应用程序也注册了同一事件,因此未处理的异常似乎也会传播到父应用程序。
是否有任何可以防止未经处理的异常不传播到我的父应用程序。
我将无法更改父应用程序行为,因为这可能会影响父应用程序内运行的其他组件。
谢谢
像这样给出事件处理程序的显式名称
您的命名空间是 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
}
这将确保异常不会传播到父应用程序