2011-08-02 20 views
3

看來,我真的不擅長與多線程應用程序。我試圖打開一個FolderBrowserDialog,但我得到一個異常告訴我:未能設置指定的COM公寓狀態

Current thread must be set to single thread apartment (STA) mode before OLE calls can be made.

我在我的主要方法STAThreadAttribute集,但的FolderBrowserDialog正在從比我的主線程的線程上調用。我試過

Thread.CurrentThread.SetApartmentState(ApartmentState.STA); 

但是,那個例外Failed to set the specified COM apartment state

我有一個創建在STA模式一個新的線程,並打開FolderBrowserDialog一個臨時的解決辦法,但我想有一個整潔的解決方案。什麼導致無法將公寓狀態設置爲STA?

+1

更好,當你創建了訪問OLE相關功能的任何線程設置'Threading.ApartmentState.STA'。 – Damith

回答

8

您必須在之前調用SetApartmentState()您啓動線程。在任何線程開始運行任何託管代碼之前,COM都由CLR初始化。還要注意,你不能在線程池線程上做到這一點,包括BackgroundWorker的。

的多個線程使用的窗戶是一般一個壞主意。線程上的窗口與主UI線程上的窗口沒有Z順序關係。這可能會導致非常尷尬的可用性問題。就像隱藏在主窗口後面的對話框一樣。沒有任務欄按鈕,用戶將永遠不會找到它。

不要爲此,使用Control.Invoke()這樣的對話是有模式的其他窗口。或者更一般地說,僅將工作線程用於非UI任務。

+0

等一下,如何在啓動之前設置當前狀態的狀態?不'Thread.CurrentThread.SetApartmentState(...)'暗示該線程已經在運行? – kristianp

+0

這是無意義的代碼,這就是爲什麼他得到了例外。在調用Start()之前,必須嚴格調用SetApartmentState()。 –

+0

好吧,我想我明白了,謝謝。 – kristianp