2010-07-01 47 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码较少,但可能不太如果有很多线程,效率会很高。

相关问题