Обработка исключений из фонового потока компонента, загружаемого динамически из приложения WPF

Мое приложение - это сборка, динамически загружаемая родительским приложением WPF. Я обрабатываю исключение AppDomain.UnhandledException из моего компонента для обработки исключения, генерируемого любыми фоновыми потоками.

Однако кажется, что, поскольку родительское приложение также зарегистрировалось для того же события, необработанное исключение распространяется и на родительское приложение.

Есть ли какие-либо, чтобы предотвратить необработанные исключения не распространяться на мое родительское приложение.

Я не смогу изменить поведение родительского приложения, так как это может повлиять на другие компоненты, работающие внутри родительского приложения.

Спасибо

2 ответа

Просто читая документацию от 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
  }

Это позволит убедиться, что исключения не распространяются на родительское приложение.

Дайте явное имя обработчику событий, как это

Пространство имен вашего - MyCompany.MyProduct.Service Пространство имен вашего родителя - MyCompany.MyProduct.Parent.

Вместо того, чтобы использовать

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

использовать следующее

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

Я надеюсь, что проблема будет решена.

Другие вопросы по тегам