2012-04-12 18 views
5

參考this FsEye問題,如何使用反射來確定某個對象是否需要其成員(或者確實是可能的特定成員)被調用在GUI線程?使用反射來確定某個對象是否需要在GUI線程上調用其成員

這種情況是:用戶在FSI(運行自己的WinForms事件循環)內創建WebBrowser對象的實例,然後嘗試展開FsEye中的節點。但是,這會導致未處理的異常對話框,警告

System.Threading.ThreadStateException:當前線程必須設置爲 單線程單元(STA)模式OLE呼叫可才製成。 確保您的Main函數具有標記的STAThreadAttribute。

(特別是在加載AccessibilityObject屬性時出現這種情況)。

我知道這是因爲FsEye載荷子懶惰地節點,異步,並且並行使用具有Async.Parallel F#異步計算式並因此調用從非原始的,非STA(此OLE對象的成員,即不原始的FSI GUI線程)線程池線程。我也知道如何通過在我的異步表達式中切換到GUI線程上下文來解決這個問題,但我只想在絕對必要時這樣做。

+0

確實['InvokeRequired'派生, ](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx)的幫助? – Daniel 2012-04-12 15:14:16

+1

@Daniel,我不這麼認爲,那隻會告訴他他不在UI線程中......他知道他不在UI線程中,他想知道這裏的這個隨機對象是否需要使用UI線程來評估自己。 – Brian 2012-04-12 18:29:12

回答

3

沒有單個成員可以查看以確定是否需要從應用程序的STA /主線程調用對象。這只是一種個人類型的合同中固有的東西

這就是說有一些線索,你可以尋找。這將表明一個物體是一個UI約束組件,但並不意味着這是一個明確的清單

  • 從Control
  • 派生,
  • 自UIElement
相關問題