Возможно, это связано с обновлениями ProgressBar в заблокированном потоке пользовательского интерфейса , но немного по-другому.
При устранении неполадок в аварийном элементе управления WinForms (древовидный список DevExpress) член нашей команды столкнулся с необычной ситуацией, и мне интересно, сможет ли кто-нибудь помочь нам понять, что происходит. Английский не является его родным языком, поэтому я пишу от его имени.
Пожалуйста, посмотрите этот скриншот из Visual Studio 2005.
Обратите внимание на следующие моменты:
Основной поток пользовательского интерфейса остановлен и в настоящее время использует метод отрисовки элемента управления DevExpress.
Код, показанный на экране, взят из точки ранее в том же стеке вызовов. Этот код находится на уровне данных и был вызван в ответ на запрос элемента управления для отображения изображения для узла дерева. (возможно, также из обработчика Paint)
Отображаемый код из более раннего в стеке вызовов, в главном потоке пользовательского интерфейса, и в настоящее время ожидает блокировки! Поскольку удаленные системы могут отправлять события, которые обрабатываются в фоновых потоках в модели данных (т. Е. Модели данных синхронизируются между клиентом и серверами), мы блокируем, чтобы обеспечить безопасность потока сбора данных.
Как показывает стек вызовов, мы продолжали обрабатывать сообщения рисования в потоке пользовательского интерфейса, в то время как мы ожидаем, что поток будет заблокирован.
Это очень сложно скопировать, и я не смог сделать это с помощью более простого тестового проекта на моей собственной коробке. Однако, когда возникает такая ситуация, результатом является то, что внутреннее состояние элемента управления DevExpress может быть испорчено, вызывая сбой элемента управления. На самом деле это не похоже на ошибку в элементе управления, поскольку он, без сомнения, был написан с предположением, что эти методы рисования выполняются только в потоке пользовательского интерфейса. То, что мы видим здесь, создает впечатление, что поток пользовательского интерфейса работает как два потока.
Казалось бы, возможно, что это просто ошибка Visual Studio в представлении стека вызовов, за исключением того, что все это усилие является результатом попытки устранить неполадки случайного сбоя элемента управления в выпущенном приложении (в этом случае он показывает как большой красный X в пользовательском интерфейсе), поэтому кажется, что проблема не изолирована от среды отладки.
Хорошо, это было сложно, но, надеюсь, имело смысл. Есть идеи?