Как приостановить все потоки после сбоя моей программы? - PullRequest
5 голосов
/ 20 августа 2010

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 20 августа 2010

Если у вас есть необработанное, неизвестное исключение, вы можете предположить, что НИЧЕГО произошло, и что ваша программа может не выполнить даже самую простую вещь. Рассмотрим, например, в случае, если он израсходовал всю доступную память - вы также не сможете отправить отчет об ошибке, потому что для этого, вероятно, требуется выделение памяти.

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

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

Временный файл должен быть удален приложением сообщений об ошибках.

0 голосов
/ 20 августа 2010

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

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

0 голосов
/ 20 августа 2010

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

...