Ada*_*son 13
(提前简化)
UI线程是单线程公寓线程,用于创建各种用户界面对象(在Winforms中,这意味着控件).按照惯例和规则,只能从用于创建它的线程中访问Control ; 否则可以并且将产生意想不到的结果,从视觉上的怪异一直到崩溃.
除非您明确创建更多,否则Windows窗体应用程序中只有一个UI线程.虽然你可以创建另一个线程并启动消息循环,但是你想要这样做的原因很少,并且两个不同的UI线程不能相互"交谈",而不是任何其他线程可以与UI线程交谈.
UI线程具有许多使其特殊的特征:
lock抽取内部消息循环以避免死锁.几乎总是选择进程的启动线程作为UI线程,尽管这不是一个硬性要求.STA状态由Main()方法的[STAThread]属性选择.
您可以通过确保满足上述要求来创建UI线程.在Winforms应用程序中看起来像这样:
var ui = new Thread(() => { Application.Run(new Form2()); });
ui.SetApartmentState(ApartmentState.STA);
ui.Start();
Run Code Online (Sandbox Code Playgroud)
这会创建第二个窗口,在自己的UI线程上运行.这种安排的一个典型问题是你现在有两个独立的窗口,它们根本没有相互关联.第2个窗口不能由1st拥有,它有自己的Z-order独立于1st.很难被用户处理.SystemEvents.UserPreferenceChanged事件值得注意,它将不可避免地在错误的线程上触发它的事件并且容易导致死锁.很多WinForms控件都订阅它.除了在极少数情况下,如启动画面,这根本不会改善用户界面.