2011-01-25 73 views

回答

7

您需要先调用Thread.SetApartmentState()才能将线程切换到STA,然后再启动它。并抽取一个消息循环以保持在该线程上创建的任何窗口都是活动的,Application.Run()。 Application.ExitThread()将终止消息循环并导致线程退出。使用Run(Form)可以自动执行,就像它在主线程中一样。

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

5

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

如果两个线程被允许同时访问同一像素 - 这将是多线程用户界面的结果 - 您需要线程间的某种同步。如果线程没有同步像素的颜色应该如何确定?

所以我们不得不加锁。每个像素的锁定成本非常高,所以我们很快会转向锁定每个控件或每个窗口。你去了:通过允许1和唯一的线程访问我们实现了锁定的UI。

顺便说一句:用控制或控制树替换像素;它不仅仅是关于共享数据的像素,无论是像素还是控制。

1

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

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