Недавно я столкнулся с классическим Гейзенбуг . Вот ситуация:
Ошибка легко воспроизводима и возникает как в конфигурациях сборки «Release», так и «Debug». Но: как только я устанавливаю точку останова в обработчике событий (для пункта меню «Добавить новый узел») и включаю его, все работает нормально => Heisenbug! Мне не нужно заниматься настоящей отладкой. Достаточно щелкнуть «продолжить» после того, как точка останова будет достигнута.
Для лучшего понимания я сделал видео , которое должно проиллюстрировать, что происходит.
Все, что я мог придумать, чтобы избавиться от этого. проблема заключалась в переводе потока (приложение однопоточное) в спящий режим на несколько секунд, но это не сработало.
Я был бы очень признателен за любые предложения о том, что я мог бы попытаться определить причину проблемы . Или, может быть, кто-то догадывается о причине?
Я нацелен на фреймворк 3.5 и использую x86 в качестве платформы решения. Элемент управления древовидным списком взят из элементов управления WinForms DevExpress ; Версия Visual Studio - 2010.
Спасибо
Обновление 3: Проблема решена . Проблема заключалась в том, что вызов метода Focus () подробного представления не запускал событие GotFocus, которое имеет решающее значение для обновления подробного представления. (Я не знаю, почему, возможно, он уже был в фокусе.) Однако метод не отказал, он просто ничего не сделал.
Теперь я просто фокусирую другой элемент управления, прежде чем сфокусироваться на подробном представлении, и все. Причина, по которой все работало нормально во время отладки, заключалась в том, что переключение с Visual Studio обратно на мое приложение правильно установило фокус на подробном представлении.
Основным препятствием при поиске этой проблемы было то, что установка точки останова в обработчике событий GotFocus бесполезна : каждый раз, когда вы пытаетесь переключиться обратно с Visual Studio в приложение, событие GotFocus запускается повторно, и вы застреваете в бесконечном цикле. Комментарии о том, как это можно обойти, приветствуются.
В любом случае, моя конкретная проблема решена.
Большое спасибо всем, кто ответил или прокомментировал. Это мне очень помогло.
Обновление 2: В моем коде я выбираю только что созданный узел в дереве. Это вызывает событие FocusedNodeChangedEvent. В соответствующем обработчике событий я обновляю подробное представление и вызываю его метод Focus ().
Кажется, что это не удается, когда не установлена точка останова. Я думаю, что правильное обновление во время отладки запускается тем, что подробное представление автоматически получает фокус.
Обновление 1: Вот сообщения окна, которые предоставил ответ Эдди. (Длинный список удаленных сообщений)