Элемент управления, созданный из потока пользовательского интерфейса ...
Да, это хороший способ вызвать эту проблему. Основная проблема вызвана классом SystemEvents, у которого незавидная задача - вызывать события в нужном потоке. Событие UserPreferenceChanged является типичным источником проблем, многие элементы управления подписываются на него, чтобы они могли перекрашивать себя, когда пользователь меняет тему рабочего стола. Поставщик компонентов не будет упускать из виду необходимость этого. Кроме того, стандартные элементы управления .NET Framework в наборе инструментов.
Обычно приличный способ проверить эту проблему - заблокировать рабочую станцию (нажать клавиши Win + L), а также способ, которым тупик обычно вызывается на компьютере пользователя. Переключение на защищенный рабочий стол имеет тенденцию вызывать событие. С дополнительными причудами это никогда не случается, когда вы отлаживаете свою программу, и что она имеет сложное поведение, связанное со временем, так как это имеет место, когда никто не находится на машине. Сложно отлаживать.
Один из стандартных способов попасть в такую проблему - это проблема инициализации в программе. Самое первое событие SystemEvents, которое подписано, приводит к тому, что класс SystemEvents инициализирует себя и настраивает соединение, необходимое для получения этих уведомлений и создания соответствующего события. Пользовательский экран-заставка, который делает слишком много (т. Е. Больше, чем просто отображает растровое изображение) и работает в рабочем потоке, помеченном как STA, достаточно, чтобы сделать это неправильно. Что-то простое, как ProgressBar уже достаточно. SystemEvents предполагает, что рабочий поток является основным потоком программы и теперь может легко генерировать события в неправильном потоке в будущем. Есть одна хорошая диагностика для этого, если этот рабочий поток больше не существует, тогда генерируется исключение первого шанса. Вы можете увидеть это в окне вывода.
Или вы создаете другой поток пользовательского интерфейса и имеете формы в обоих потоках. Неизбежно, что одна из этих форм всегда будет получать событие не в том потоке.
Единственный достойный совет - признать, что создание пользовательского интерфейса в рабочем потоке - это ракетостроение, которое Microsoft также не знала, как это сделать правильно. Следует отметить, что элементы управления .NET 1.x имеют обработчик событий, который все еще работает правильно, когда он вызывается из неправильного потока, он просто вызывает Control.Invalidate (). Но это было знание, которое, похоже, было потеряно в 2.0, ToolStrip - хороший пример . И не верьте поставщику компонентов, чтобы получить это право, в частности, у Infragistics нет звездной репутации. Не делай этого.