Обработка исключений из фонового потока компонента, загружаемого динамически из приложения 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);
Я надеюсь, что проблема будет решена.