Что такое поток UI? Есть ли в приложении.NET только один поток UI?
(Впереди упрощение)
Поток пользовательского интерфейса - это поток однопоточной квартиры, который используется для создания различных объектов пользовательского интерфейса (в Winforms это означает элементы управления ). По соглашению и правилу к элементу управления можно получить доступ только из потока, который использовался для его создания; поступление иначе может привести и приведет к неожиданным результатам, начиная от визуальных странностей и заканчивая аварией.
Если вы явно не создадите больше, в приложении Windows Forms будет только один поток пользовательского интерфейса. Хотя вы можете создать другой поток и запустить цикл сообщений, есть очень мало причин, по которым вы захотите это сделать, и два разных потока пользовательского интерфейса не могут «разговаривать» друг с другом больше, чем любой другой поток. может разговаривать с потоком пользовательского интерфейса.
Отредактировано для правильности:
Существует один поток пользовательского интерфейса для каждого активного ПРИЛОЖЕНИЯ в Windows Forms и аналогичная концепция для WPF.
то есть: когда вы запускаете приложение, есть один поток, он становится потоком пользовательского интерфейса, когда Application.Run (new Form1 ()); называется.
Если вы попытаетесь выполнить Application.Run (new Form2 ()); во время выполнения вы получите «System.InvalidOperationException: запуск второго цикла сообщений в одном потоке не является допустимой операцией. Вместо этого используйте Form.ShowDialog».
Если вам действительно нужны две отдельные формы, чтобы не использовать один и тот же поток, вы потребуется создать новый поток, затем вызвать Application.Run (new MyForm ()) и т. д. и т. д. Это нечасто.
Поток пользовательского интерфейса имеет ряд характеристик, которые делают его особенным:
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 подписываются на него. За исключением редких случаев, таких как заставка, это совсем не улучшает пользовательский интерфейс.