2010-07-01 69 views
1

蔭試圖在工作流中的COM服務 創建一個WPF窗口,但IAM收到以下錯誤:Windows工作流基礎用的Windows Presentation Foundation

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: The calling thread must be STA, because many UI components require this. 
    at System.Windows.Input.InputManager..ctor() 
    at System.Windows.Input.InputManager.GetCurrentInputManagerImpl() 
    at System.Windows.Input.InputManager.get_Current() 
    at System.Windows.Input.KeyboardNavigation..ctor() 
    at System.Windows.FrameworkElement.FrameworkServices..ctor() 
    at System.Windows.FrameworkElement.EnsureFrameworkServices() 
    at System.Windows.FrameworkElement..ctor() 
    at System.Windows.Controls.Control..ctor() 
    at System.Windows.Window..ctor() 
    at PACIExpress.SelectLanguage..ctor() 

任何人可以幫助我嗎?

回答

2

例外狀態正是問題:

的所有如果「工作流的COM服務」就像是一個WCF或Web服務的任何

System.InvalidOperationException: The calling thread must be STA, because many UI components require this.

首先,它不是一個桌面應用程序,可以有一個用戶界面。

無論哪種方式你的應用程序必須是STA。

MTA和STA之間的區別:

Could you explain STA and MTA?

信息有關WPF和STA: http://msdn.microsoft.com/en-gb/magazine/cc163328.aspx

如果你有一個入口點方法,要使用STAThread屬性,在這裏看到更多信息:

http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx

希望有所幫助!

2

Kieren的回答解釋了問題的實質,即Workflow Foundation線程是MTA線程,而WPF需要STA線程。基倫的回答並沒有解釋如何解決這個問題。

無論何時我需要從MTA線程訪問WPF內容,我都會創建一個STA線程來訪問內容。我已經使用這個兩種解決方案,兩者都運行良好:

彙集STA線程

當WPF對象不需要存在超越目前的方法調用,我使用了一個STAThreadPool類我寫的。 STAThreadPool實現System.Threading.ThreadPool的基本功能,但創建它的線程STA而不是MTA。它還有一個RunOnSTAThread方法,它將用戶工作項目排隊,然後等待該項目完成。

專用STA線程

這種解決方案是有更多的開銷,但需要的任何時間WPF對象可能存在多個方法調用。再有一個「RunOnSTAThread」的方法,在這種情況下被實施:

  1. 如果當前線程是STA,只是執行的操作
  2. 看在字典,看看是否有是一個STA線程這個MTA線程(必須鎖字典)。
  3. 如果未找到STA線程:創建STA線程並將其添加到字典。
  4. Store中STA線程的操作,信號STA線程來執行,並等待它完成

每個STA線程運行一個循環,這是否:

  1. 如果與MTA線程不存在,請退出
  2. 等待Action發出運行準備好的信號,並且超時10秒。如果超時,則轉到步驟1
  3. 執行行動
  4. 信號動作完成
  5. 轉到步驟1

這種解決方案實際上比寫得很好STAThreadPool碼較少,但可能不太如果有很多線程,效率會很高。

相關問題