Как отладить и решить сбой "DisconnectedContext"?

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

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

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

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

Так вот вопросы:

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

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

1 ответов


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

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

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

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