Как отладить и устранить ошибку 'DisconnectedContext'? - PullRequest
6 голосов
/ 12 января 2010

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

В настоящее время я публикую данные в графическом интерфейсе с помощью ProgressChanged, который с самого начала работал хорошо. С тех пор я увеличил скорость передачи данных и обнаружил проблему; если программное обеспечение оставлено для работы на несколько минут, объем использования процессора, по-видимому, увеличивается, пока не достигнет почти 100% на обоих ядрах на моем компьютере, и в этот момент я получаю сообщение об ошибке:

Помощник по управляемой отладке «DisconnectedContext» обнаружил проблему в «myapp.exe». Дополнительная информация: Контекст 0xe2ba0 отключен. Освобождение интерфейсов из текущего контекста (контекст 0xe2d10). Это может привести к повреждению или потере данных.

Я читал кое-что в интернете, что говорит о том, что это может произойти, если приложение с графическим интерфейсом не может качать сообщения достаточно быстро. Я заметил, что я могу спровоцировать тот же сбой, который произойдет быстрее, если я быстро изменю размер окна (т.е. добавлю больше сообщений), что поддерживает теорию, я думаю?

Итак, вопросы здесь:

  1. Согласен ли кто-нибудь с моей гипотезой о прокачке сообщений?
  2. Есть ли другое объяснение?
  3. Есть ли способ, которым я могу это доказать (возможно, посмотреть количество сообщений в очереди)?
  4. Неужели все эти неприятные запахи кода указывают на то, что я поступаю неправильно?

Любой совет будет принят с благодарностью.

1 Ответ

3 голосов
/ 06 февраля 2010

Это звучит как очень специфическая проблема, и я думаю, поэтому никто еще не ответил, но я думаю, что могу помочь по вопросу № 3.

Spy ++ должен видеть сообщения, идущие в ваше окно. Я думаю, что вы могли бы использовать его, чтобы посмотреть, как сообщения перекачиваются в ваш графический интерфейс и выполнить тест на изменение размера. Если вы заметили значительное увеличение количества попыток обработки сообщений, это может подтвердить вашу гипотезу.

Кроме того, я читал, что вы можете изменить квартиру основного потока с STAThread на MTAThread, чтобы этот MDA исчез.

Возможно, вы могли бы изменить свое приложение, чтобы выводить показания датчиков в файл или ставить их в очередь в другом механизме, вместо того, чтобы постоянно обновлять графический интерфейс. НТН.

...