2011-01-25 64 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();