Я все еще не совсем уверен, что понимаю вопрос, но упомяну несколько вещей:
Application.ThreadException
и Application.SetUnhandledExceptionMode
применяются только к потокам Windows Forms.Произвольные потоки ThreadPool
на самом деле не являются потоками Windows Forms, даже в приложении Winforms, поэтому эти две строки кода неэффективны.
Регистрация события с помощью AppDomain.CurrentDomain.UnhandledException
будет исключения ловушек, возникающие в потоках ThreadPool
.
Однако , событие UnhandledException
не может фактически обрабатывать исключение.К тому времени уже слишком поздно, чтобы остановить завершение процесса, что всегда будет происходить, если в фоновом потоке возникает исключение (если вы не включили устаревшее поведение .NET 1.1, но ... не делаете.) Это событиедействительно хорош только для регистрации или очистки.
Я сам проверил это, используя тестовый код, похожий на ваш, и убедился, что код внутри исключения «обработчик» действительно выполняется.Но приложение все равно будет зависать, и вы не сможете его остановить.
Обновление: Я собираюсь сделать еще одну попытку, и все.
Если ваша цель - постоянно запускать приложение без присмотра, у вас есть три варианта:
Правильно обрабатывайте исключения. Это безусловно, , лучшее и, вероятно, единственно правильное решение.Перехват AppDomain.UnhandledException
- это , а не , обрабатывающий исключение.К тому времени, когда элемент управления войдет в этот обработчик событий, в вашем приложении уже произошел сбой.Вы больше не можете его сохранить.
Необработанное исключение, выходящее из фонового потока, является катастрофической ошибкой в вашем коде, которую необходимо исправить.Необработанное исключение, выходящее из фонового потока, является катастрофической ошибкой в вашем коде, которую вам нужно исправить.Необработанное исключение, выходящее из фонового потока, является катастрофической ошибкой в вашем коде, которую вам необходимо исправить. Пожалуйста, больше никаких комментариев к эффекту "Мне все равно" - вам нужно начать заботливый.
Попросите Windows вежливо перезапустить приложение для вас. В отличие от попытки перезапуска из обработчика сбоя, который невероятноплохая идея по причинам, слишком многочисленным для полного перечисления (повреждение данных, бесконечные циклы перезапуска, утечки ресурсов, нестабильность ОС и т. д.), регистрация 1064 * для перезапуска фактически позволяет этому происходить полууправляемым образом.Как я упоминал в комментариях, просто взаимодействовать с этим API в .NET.Вы регистрируетесь для этого, как только приложение запускается, а не когда происходит сбой, и ваше приложение находится в ненадежном состоянии.
Создайте службу супервизора, которая будет наблюдать за вашим приложением и перезапускать его в случае сбоя.,Это по-прежнему плохо по многим причинам, обсуждавшимся в предыдущих двух пунктах, но у вас, по крайней мере, есть некоторый шанс на некоторый уровень стабильности.
Вы можете получить достаточно надежное указание на сбой приложения, используяс именем mutex, ожидая этого в вашем супервизоре и следя за состоянием WAIT_ABANDONED
(AbandonedMutexException
в .NET).Заброшенное состояние возникает только тогда, когда процесс, который владеет мьютексом, завершается без его освобождения, то есть имеет необработанное исключение.И с немного большим количеством хакерских атак вы также можете обнаружить и закрыть окно сбоя.
Это ваши варианты.Я настоятельно рекомендую вам обрабатывать исключения в фоновых потоках, потому что необработанное исключение, выходящее из фонового потока, является катастрофической ошибкой в вашем коде, которую необходимо исправить. Если это происходит из внешнего компонента, и вы можете 'Если вы не поймете это, то катастрофическая ошибка в этом компоненте, и вам следует рассмотреть возможность сообщить об этом автору или использовать другой компонент.
Простое требование, гласящее, что «это приложение должно работать постоянно и должно полностью игнорировать фатальные сбои», не делает такой сценарий возможным, если приложение недостаточно стабильно, чтобы фактически продолжать работать. Авария - это крушение. Вы не разрабатываете машину, чтобы просто перезапустить себя немедленно, если двигатель внезапно заглох. Лучшее, что вы можете сделать, - это попросить доверенного оператора, будь то оператор, операционная система или какое-либо контролирующее программное обеспечение, перезапустить приложение от его имени.
Вариации этого вопроса, кажется, возникают так часто - в основном: «Мое приложение никогда не должно падать, или, если оно происходит, оно должно быть невидимым. Я хочу съесть каждое необработанное исключение и сделать вид, что этого не произошло». Это не только невозможно, но и противоречит практически каждому принципу хорошего дизайна (особенно принципу «быстро провалиться», который, безусловно, может быть истолкован заново, но никогда не должен игнорироваться полностью).
Это все, что я могу сказать. Если вы не хотите принимать что-либо из этого, тогда удачи в поиске приемлемой альтернативы.