Как отладить и решить катастрофический отказ 'DisconnectedContext'?

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

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

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

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

Таким образом, вопросы здесь:

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

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

6
задан Jon Cage 3 February 2010 в 09:23
поделиться

1 ответ

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

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

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

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

3
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: