Как мне приостановить все темы после сбоев моей программы?

StackOverflow https://stackoverflow.com/questions/3534363

Вопрос

У меня есть необработанный обработчик исключения. Он показывает хороший графический интерфейс и позволяет пользователям отправлять сообщение об ошибках. Пользователи могут даже оставить свое имя и номер телефона и вещи, а наша служба поддержки вызывает их обратно. Хорошо работает, выглядит хорошо, делает клиентов менее злыми. Теоретически, в любом случае.

Проблема в том, что мое приложение использует фоновые потоки, а темы, похоже, не уходятся, если исключение было выброшено, скажем, поток GUI (что имеет смысл), и просто продолжайте свою работу. Это в конечном итоге приводит к появлению диалога WER, если пользователь позволяет вам на заказ окно обработчика исключений оставаться открытым достаточно долго, заставляя его выглядеть так, как он выглядит по себе, а не разбито по себе обработку ошибок.

У меня нет доступа к объектам потока в объеме обработчика исключений, поэтому я не могу их приостановить. Создание объектов потока во всем мире доступно не решение. Мой обходной путь сейчас - использовать что-то вроде Globals.Crashed = true; В моем обработке исключений и, чтобы мои методы потока проверяют, что свойство при каждой итерации цикла. Не идеально, но он минимизирует ущерб.

Кто-нибудь знает менее хаки? Мой подход не так? Должен ли я сделать это, как WER делает и запустить внешнюю программу, которая приостанавливает основную программу и показывает ошибку UI?

Это было полезно?

Решение

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

Хороший подход - написать отдельный Небольшое приложение, которое просто делает сообщение об ошибке. Это приложение может забрать детали, чтобы сообщить из файла. Таким образом, ваш неизвестный Handler исключение будет:

  • Сбросьте информацию в файл в каталоге Temp.
  • Запустите приложение отчетности об ошибках с именем файла в качестве аргумента.
  • Прекратить провал процесс, прежде чем он делает что-то глупое.

Файл Temp должен быть удален приложением отчетов об ошибках.

Другие советы

Вы можете отслеживать все свои потоки в глобальном объекте для сбора, чтобы, когда ваш обработчик выполняется, он может просто перейти через объект сбора и прервать нити.

Посмотрите на код в этом вопросе, Приостановить процесс в C #, Вам нужно будет настроить его, чтобы не приостановить вашу битую графического интерфейса и любые, которые не начали фона, но это должно сделать трюк.

Однако лучший вариант, чтобы попытаться запустить свой отчет об ошибке GUI как отдельный процесс, передавая любую необходимую информацию для нее, а затем убить оригинальный процесс от обработчика необработанного исключения, а не позволить что-либо запустить в потенциально поврежденном состоянии. Отказ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top