Каково определение потока UI? Есть ли в приложении.NET только один поток UI?

Что такое поток UI? Есть ли в приложении.NET только один поток UI?

14
задан 4 May 2010 в 19:19
поделиться

3 ответа

(Впереди упрощение)

Поток пользовательского интерфейса - это поток однопоточной квартиры, который используется для создания различных объектов пользовательского интерфейса (в Winforms это означает элементы управления ). По соглашению и правилу к элементу управления можно получить доступ только из потока, который использовался для его создания; поступление иначе может привести и приведет к неожиданным результатам, начиная от визуальных странностей и заканчивая аварией.

Если вы явно не создадите больше, в приложении Windows Forms будет только один поток пользовательского интерфейса. Хотя вы можете создать другой поток и запустить цикл сообщений, есть очень мало причин, по которым вы захотите это сделать, и два разных потока пользовательского интерфейса не могут «разговаривать» друг с другом больше, чем любой другой поток. может разговаривать с потоком пользовательского интерфейса.

13
ответ дан 1 December 2019 в 12:38
поделиться

Отредактировано для правильности:

Существует один поток пользовательского интерфейса для каждого активного ПРИЛОЖЕНИЯ в Windows Forms и аналогичная концепция для WPF.

то есть: когда вы запускаете приложение, есть один поток, он становится потоком пользовательского интерфейса, когда Application.Run (new Form1 ()); называется.

Если вы попытаетесь выполнить Application.Run (new Form2 ()); во время выполнения вы получите «System.InvalidOperationException: запуск второго цикла сообщений в одном потоке не является допустимой операцией. Вместо этого используйте Form.ShowDialog».

Если вам действительно нужны две отдельные формы, чтобы не использовать один и тот же поток, вы потребуется создать новый поток, затем вызвать Application.Run (new MyForm ()) и т. д. и т. д. Это нечасто.

0
ответ дан 1 December 2019 в 12:38
поделиться

Поток пользовательского интерфейса имеет ряд характеристик, которые делают его особенным:

  • В Windows есть очередь сообщений, связанная с потоком. Это происходит, как только в потоке создается самое первое окно.
  • Поток запускает цикл сообщений, позволяя Windows отправлять сообщения окнам. Цикл сообщений создается, как только вы вызываете Application.Run ().
  • COM был инициализирован в потоке, запрашивая однопоточное подразделение. STA необходим для правильной работы многих функций Windows, которые не являются потокобезопасными по своей конструкции. COM гарантирует, что эти функции всегда вызываются потокобезопасным образом, при необходимости маршалируя вызов из рабочего потока в поток STA. Примерами этих функций являются Drag + Drop, буфер обмена, диалоги оболочки (OpenFileDialog и т. Д.), Элементы управления ActiveX, такие как WebBrowser, перехватчики окон, установленные SetWindowsHookEx, поставщики специальных возможностей, такие как используемые программой чтения с экрана, поставщики автоматизации пользовательского интерфейса. Весь внешний код, ни один из них не ориентирован на многопоточность.
  • Поток никогда не блокируется при выполнении каких-либо операций, он остается отзывчивым, поэтому он может отправлять сообщения Windows по мере необходимости, чтобы пользовательский интерфейс оставался отзывчивым и запросы маршалинга COM выполнялись. Например, вызовы WaitHandle.WaitAny () явно запрещены и генерируют исключение. CLR имеет специальную поддержку WaitOne () и lock , перекачивая внутренний цикл сообщений, чтобы избежать взаимоблокировки.

Поток запуска процесса почти всегда выбирается как поток пользовательского интерфейса, хотя это не является жестким требованием. Состояние STA выбирается атрибутом [STAThread] в методе Main ().

Вы можете создать поток пользовательского интерфейса, убедившись, что соблюдены вышеуказанные требования. В приложении Winforms это может выглядеть так:

    var ui = new Thread(() => { Application.Run(new Form2()); });
    ui.SetApartmentState(ApartmentState.STA);
    ui.Start();

Это создает второе окно, работающее в собственном потоке пользовательского интерфейса. Одна из типичных проблем, с которыми вы сталкиваетесь при таком расположении, заключается в том, что теперь у вас есть два отдельных окна, они вообще не связаны друг с другом. Второе окно не может принадлежать 1-му, у него свой Z-порядок, независимый от 1-го. Пользователю сложно с этим справиться. Событие SystemEvents.UserPreferenceChanged примечательно, оно неизбежно запускает свое событие в неправильном потоке, что может вызвать тупик. Многие элементы управления WinForms подписываются на него. За исключением редких случаев, таких как заставка, это совсем не улучшает пользовательский интерфейс.

9
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: