Как отладить и решить сбой "DisconnectedContext"?
у меня есть приложение GUI, которое подключается к датчику, собирает данные и обрабатывает их в фоновом режиме с помощью BackgroundWorker
потоки.
как это стоит, я отправляю данные в GUI, используя ProgressChanged
который, казалось, работал хорошо с самого начала. С тех пор я увеличил скорость передачи данных и обнаружил проблему; если программное обеспечение осталось работать в течение нескольких минут, объем использования процессора, похоже, увеличивается до тех пор, пока он не достигнет 100% на обоих ядрах на моей машине, и в этот момент я получаю ошибка, которая гласит:
помощник по управляемой отладке "DisconnectedContext" обнаружил проблему в " myapp.exe. Дополнительная информация: контекст 0xe2ba0 отключен. Освобождение интерфейсов из текущего контекста (контекст 0xe2d10). Это может привести к повреждению или потере данных.
Я прочитал некоторые вещи в интернете, которые предполагают, что это может произойти, если приложение GUI не может достаточно быстро перекачивать сообщения. Я заметил, что могу спровоцировать тот же самый крах. произойдет быстрее, если я быстро изменю размер окна (т. е. накачаю нагрузку больше сообщений), что поддерживает теорию, которую я думаю?
Так вот вопросы:
- согласен ли кто-нибудь с моей гипотезой о прокачке сообщений?
- есть ли другое объяснение?
- есть ли способ доказать это (возможно, подсмотреть количество сообщений в очереди)?
- это все плохие запахи кода, которые предполагают, что я иду об этом неправильно способ?
любой совет был бы очень благодарен.
1 ответов
этот вид звучит как очень конкретная проблема, и я думаю, что именно поэтому никто еще не ответил, но я думаю, что могу помочь в вопросе № 3.
Spy++ должен иметь возможность видеть сообщения, идущие в ваше окно. Я думаю, вы можете использовать его, чтобы посмотреть, как сообщения перекачиваются в ваш GUI и выполняют тест изменения размера. Если вы видели большое увеличение сообщений, которые пытаются быть обработаны, это может подтвердить вашу гипотезу.
кстати, я читал, что вы могли бы измените квартиру основного потока с STAThread на MTAThread, чтобы этот MDA исчез.
Perphaps вы можете изменить свое приложение, чтобы выплюнуть показания датчика в файл или поставить их в очередь в другом механизме вместо постоянного обновления GUI. HTH.