Ситуация:
У меня довольно сложное консольное приложение, запускающее несколько потоков, каждый из которых генерирует подпотоки и т. Д. (Для 3 или 4 уровней). Все в основном связано с делегатами/событиями. Я знаю, что блоки try/catch в области, где создается поток, не имеют отношения к этому потоку, когда он начинает выполняться. Я хочу найти чистый способ справиться с этим.Глобальная обработка исключений в многопоточных джунглях - Fail Safe/Restart
Для иллюстрации, следующая картина часто появляется на многих уровнях в моем приложении:
public void Activate()
{
ThreadPool.QueueUserWorkItem(Activate_Entrypoint);
}
Выпуск:
До тех пор, как я до сих пор разработки/отладки, исключения были брошены «на поток «на микроуровне.
Тем не менее, мне нужно построить и подготовить производственный пакет, так что все должно работать плавно в случае исключения. Поэтому мне нужно чистое пользовательское сообщение/журнал и выключение/перезагрузка на верхнем уровне. Режим Поднятие
Исключение:
Я реализовал OnUnhandledException
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
Однако это, кажется, не будет когда-либо поднимавшихся, как я бы ожидать. Erratum Редактировать: он действительно правильно поднимается, он не стрелял, потому что я объявил привязку слишком поздно в основном.
Я установил деление на ноль в разных потоках, чтобы включить или отключить отслеживание поведения приложения.
ВАЖНО - Clean Design:
мне нужно Главная Top тему быть только скорлупа, имея наблюдателя на остальной части приложения. Если произошла критическая ошибка, мне бы хотелось, чтобы эта ветка была . Остановите все. (Прерывание дочерней строки приложения, которую она запустила), а затем Перезапустите его снова. Вы слышали это: я не хочу, чтобы уродливый крах просто остановил все. Я хотел бы изолировать приложение в потоке обертки, которое позаботится о том, чтобы он все еще работал и перезапускал (это приложение на стороне 24/7 на стороне сервера). Я также хотел бы избежать всякого возможного исключения везде, где это было бы ад. Я просто хочу, чтобы ремни безопасности позволяли удалять необработанные исключения, если они произошли, и управлять ими чистым способом, перезапустив приложение из главного главного потока.
Возможные решения:
я наткнулся на несколько постов о флаг прохождения и регулярной проверки среди потока. Это звучит интересно, хотя это может усложниться при использовании большого количества уровней потоков. Я использую Quartz.net, чтобы запланировать постоянную задачу проверки на некоторых флагах и принять меры, чтобы остановить потоки и перезапустить их при необходимости. Еще не закончил, просто давая ему шанс.
Если я пропустил что-то, пожалуйста, несите меня и просто просите подробности, это не поле, в котором мне действительно комфортно (пока).
Ресурсы: Joseph Albahari on Threading/
Вам нужно получить приложение AppDomain.UnhandledException. Очень непонятно, почему у вас возникнут проблемы с этим. –
Что касается того, что UnhandledException не вызывается, пытались ли вы явно исключать исключение, а не делить на ноль? Я не совсем уверен, но я считаю, что деление на ноль приведет только к исключению в «проверенном» контексте; по умолчанию компилятор будет использовать «непроверенную» арифметику и, таким образом, будет генерировать значения NaN или INF, а не бросать исключения. –
Чтобы быть уверенным, существует только 1 (один) AppDomain? – rene