Обработка ObjectDisposedException и подобных исключений во время завершения процесса? - PullRequest
3 голосов
/ 01 мая 2009

Мое приложение обычно работает на 10-20 потоках, и эти потоки отправляют события в графический интерфейс для обновления определенных элементов управления почти каждую секунду.

Когда пользователь закрывает середину приложения, все обновления, связанные с этими событиями, вызывают несколько случайных сбоев. В основном ObjectDisposedException и NullReferenceException.

Поскольку события, которые уже были сгенерированы, но еще не обработаны .NET Framework, они не находятся в состоянии, когда я могу их отменить.

Я не совсем уверен, как лучше всего справиться с этим. В настоящее время я просто глотаю исключения.

Ответы [ 2 ]

4 голосов
/ 01 мая 2009

Несколько вариантов:

  • когда приложение начинает закрываться (FormClosing?), Вы можете начать чистый выход из потоков (через флаг где-то)
  • предположительно, чтобы поговорить с вашим пользовательским интерфейсом, вы вызываете события, которые обрабатываются пользовательским интерфейсом (который обрабатывает синхронизацию и т. Д.) - сохраняете флаг и (если это безопасно делать) просто отбрасываете события, если флаг был установлен (опять же, потому что вы выходите)
  • при выходе пользовательский интерфейс должен отписываться от событий
1 голос
/ 01 мая 2009

В дополнение к предложениям Марка Гравелла , есть еще несколько вещей:

  • С любой точки вы можете проверить Environment.HasShutdownStarted, прежде чем делать что-либо, что может вызвать ObjectDisposed исключение
  • Если у вас есть доступ к любым формам окон, вы можете проверить .IsDisposed (все формы и элементы управления имеют его)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...