C#windows应用程序中的两个UI线程

如何在C#windows应用程序中实现两个ui线程?

在启动之前,需要调用Thread.SetApartmentState()将线程切换到STA。 并且使用消息循环来保持在该线程上创建的任何窗口,Application.Run()。 Application.ExitThread()将终止消息循环并导致线程退出。 使用Run(Form)使其自动化,就像在主线程上一样。

但请注意,用户可能很难处理您在该线程上创建的窗口。 它们与主线程中的窗口没有Z顺序关系,桌面是它们的父级。 这往往会让他们很容易迷失在另一个窗口后面,包括你自己的窗户。 这方面的尴尬解决方法是TopMost和pinvoking SetParent()。

这可能不是一个答案,而是更多的解释。

如果允许两个线程同时访问同一个像素 – 这是multithreadingUI的结果 – 你需要在线程之间进行某种同步。 如果线程没有同步,应该如何确定像素的颜色?

所以我们必须添加锁定。 锁定每个像素是非常昂贵的,因此我们很快就会转向锁定每个控件或每个窗口。 你去:通过允许1和只有1个线程访问我们实现锁定的UI。

BTW:用control或controltree替换像素; 它不仅仅是关于共享数据的像素,无论是像素还是控件。

在新线程中调用Application.Run(...) ,它将使用自己的消息循环打开表单。

 new Thread(() => Application.Run(someForm)).Start();