2010-01-29 52 views
4

我有一個應用程序有兩個不同組的勝利形式,我希望每個組在單獨的線程中操作。只要我在不同的線程中進行操作時BeginInvoke/Invoke,這種方法是否有問題?在一個線程和另一個線程中有一組win窗體是否有任何問題?

這個問題源於我一直習慣用'gui線程'來思考的事實,即我必須使用if (InvokeRequired) { Invoke } else { ... },並且所有窗體都在該線程上。

對這個問題的另一種角度:

有什麼「特別」關於贏得形式存在,或者是它與任何其他線程的默認線程?

回答

2

好了,有辦法拍腳,但Windows窗體很少忘了告訴你這件事。

是的,關於「主線程」有一些特別之處。它運行在STA模式,一個單線程的公寓。它是一種影響COM組件的模式,像OpenFileDialog這樣的shell對話框以及Drag + Drop和Clipboard等操作。顯示UI的線程始終必須是STA。這是在Main()方法中使用[STAThread]屬性的普通WF應用程序中自動執行的。在你自己的應用程序中,你必須在啓動它之前調用Thread.SetApartmentState()。線程是特殊的,因爲它抽取了一個消息循環(Application.Run),這是STA線程的一個需求。

默認情況下,您啓動的任何線程或任何線程池線程以MTA模式運行。線程池線程不能改變,它們總是MTA。

0

它應該工作得很好,我非常肯定,在我目前的項目中,它是這樣實現的,我們沒有看到任何問題。當您使用InvokeRequired和Invoke方法時,只需要記住使用正確的控件。

一個GUI線程只是簡單地抽取消息,以便它可以處理標準的Windows消息,我不認爲還有什麼特別的地方。

0

我能想到的唯一問題是與非常非常古老的COM組件有關,這些組件與主單線程公寓有關。

msdn.microsoft.com

但這是不太可能

相關問題