Iam正在尝试在Workflow Com服务中创建WPF窗口,但iam收到以下错误:
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()有谁能帮帮我吗?
发布于 2010-07-01 15:14:03
异常准确地说明了问题:
System.InvalidOperationException:调用线程必须是STA,因为许多UI组件都需要它。
首先,如果“Workflow Com service”有点像WCF或Web服务,那么它就不是一个可以有用户界面的桌面应用程序。
无论哪种方式,您的应用程序都必须是STA。
MTA和STA的区别:
关于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
希望这能有所帮助!
发布于 2010-07-01 17:07:54
Kieren的回答解释了问题的本质,即Workflow Foundation线程是MTA线程,而WPF需要STA线程。Kieren的回答没有解释如何解决这个问题。
每当我需要从MTA线程访问WPF内容时,我都会创建一个STA线程来访问该内容。为此,我使用了两种解决方案,这两种解决方案都运行良好:
池化STA线程
当WPF对象不需要存在于当前方法调用之外时,我使用我编写的STAThreadPool类。STAThreadPool实现了System.Threading.ThreadPool的基本功能,但创建了它的线程STA而不是MTA。它还具有一个RunOnSTAThread方法,该方法对用户工作项进行排队,然后等待该项完成。
专用STA线程
此解决方案具有更多的开销,但在WPF对象可能存在于多个方法调用时都是必需的。还有一个"RunOnSTAThread“方法,在本例中它是通过以下方式实现的:
锁定未找到STA线程:创建STA线程并将其添加到STA线程中的操作,用信号通知STA线程执行,然后等待它完成dictionary).
每个STA线程运行一个执行以下操作的循环:
这种解决方案实际上比编写良好的STAThreadPool代码更少,但如果有很多线程,效率可能会较低。
https://stackoverflow.com/questions/3155564
复制相似问题