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

时间:2011-01-25 12:08:29

标签: c# winforms

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:1)

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

new Thread(() => Application.Run(someForm)).Start();
相关问题