首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows Workflow Foundation与Windows Presentation Foundation

Windows Workflow Foundation与Windows Presentation Foundation
EN

Stack Overflow用户
提问于 2010-07-01 14:40:06
回答 2查看 619关注 0票数 1

Iam正在尝试在Workflow Com服务中创建WPF窗口,但iam收到以下错误:

代码语言:javascript
复制
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()

有谁能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2010-07-01 15:14:03

异常准确地说明了问题:

System.InvalidOperationException:调用线程必须是STA,因为许多UI组件都需要它。

首先,如果“Workflow Com service”有点像WCF或Web服务,那么它就不是一个可以有用户界面的桌面应用程序。

无论哪种方式,您的应用程序都必须是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
EN

Stack Overflow用户

发布于 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).

  • If dictionary.

  • Store

每个STA线程运行一个执行以下操作的循环:

  1. 如果相应的MTA线程不活动,则退出
  2. 等待操作准备运行的信号,超时时间为10秒。如果超时,请转至步骤1并执行Action
  3. Signal
  4. go to step 1

这种解决方案实际上比编写良好的STAThreadPool代码更少,但如果有很多线程,效率可能会较低。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3155564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档