ОБНОВЛЕНИЕ: просто подытожим то, что мой вопрос сводился к:
Я надеялся, что создание .NET-форм и элементов управления НЕ создало никаких оконных ручек - надеясь, что процесс был задержан до тех пор, пока Form.Show/Form.ShowDialog
Может ли кто-нибудь подтвердить или опровергнуть, верно ли это?
У меня есть большая форма WinForms с элементом управления вкладками, много элементов управления в форме, которая приостанавливается при загрузке в течение пары секунд. Я сузил его до кода, созданного конструктором, в InitializeComponent, а не в моей логике в конструкторе или OnLoad.
Мне хорошо известно, что я не могу пытаться взаимодействовать с пользовательским интерфейсом в любом потоке, отличном от основного потока пользовательского интерфейса, но я бы хотел, чтобы приложение предварительно загрузило эту форму (запустите конструктор) в фоновом режиме, поэтому он готов для отображения в потоке пользовательского интерфейса мгновенно, как только пользователь хочет его открыть. Однако при построении в фоновом потоке на этой строке в конструкторе:
this.cmbComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
Я получаю сообщение об ошибке
Текущий поток должен быть установлен на один (STA) до OLE звонки могут быть сделаны. Убедитесь, что ваш Основная функция имеет STAThreadAttribute отмеченные на нем.
Теперь это на полпути файл дизайнера, который дает мне надежду, что в целом эта стратегия будет работать. Но эта конкретная строка, похоже, пытается мгновенно начать какой-то вызов OLE.
Любые идеи?
EDIT:
Думаю, я не объясню здесь. Задержка, по-видимому, имеет место при создании элементов управления bazillion во время кода, созданного конструктором.
Моя надежда заключалась в том, что весь этот код инициализации имел место, фактически не пытаясь коснуться каких-либо реальных оконных объектов Win32, так как форма пока еще не показана.
Тот факт, что я могу установить (например) тексты ярлыков и позиции из этого фонового потока, дал мне надежду, что это правда. Однако это может быть неверно для всех свойств.