问题标签 [sta]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
82016 浏览

c# - STAThread 和多线程

来自关于 STAThread 的 MSDN 文章:

指示应用程序的 COM 线程模型是单线程单元 (STA)。

(仅供参考,这是整篇文章。)

单线程公寓...好吧,这超出了我的想象。另外,我在某处读到,除非您的应用程序使用 COM 互操作,否则此属性实际上什么都不做。那么它究竟做了什么,它又如何影响多线程应用程序呢?多线程应用程序(包括从任何使用Timers 到异步方法调用的任何东西,而不仅仅是线程池等)是否应该使用 MTAThread,即使它“只是为了安全”?STAThread 和 MTAThread 实际上是做什么的?

0 投票
1 回答
4655 浏览

c# - 带有 Windows 窗体的 WPF - STAThread

我是 WPF 的新手,有几个关于 WPF 和 Windows 窗体集成的问题。

我有一个现有的 Visual C# Windows 窗体应用程序。我想将它与 WPF 窗口集成,该窗口可以在单击按钮时显示。这是不可能的,因为 WPF 期望调用线程是 STAThread,并且默认情况下 WinForm 假定线程是 MTAThread。我尝试使用 STAThread 的单元状态生成一个新线程来调用 WPF UI,但这不起作用。我也尝试使用 Dispatcher.BeginInvoke 方法和 Background Worker,但它们都没有解决问题。

1) 我们可以在不将 Main 标记为 STAThread 的情况下调用 WPF 窗口/控件吗?如果可能的话,谁能指出我正确的方向?2) 如果实现此目的的唯一方法是使主线程成为 STAThread,是否会对应用程序的一般性能/响应能力产生任何影响。

提前致谢。

0 投票
3 回答
1519 浏览

c# - 是否可能有同一个组件的两个 COM STA 实例?

我在这里的另一个线程上发现了一个问题,我需要访问一个 STA 的 COM 组件。我将在双核计算机上运行它,使用该组件的进程仅达到50%的CPU。可惜车主说不能把组件改成MTA,因为组件是Matlab编译的混合系统,核心是C。

所以我试图在同一个进程上加载 COM 类的两个实例,不同的线程访问它,但我做不到,只有最后一个 COM 实例可用。你知道什么可以解决这个问题吗?

我正在考虑在同一台计算机上运行我的服务的两个进程,以实现 100% cpu。这不是一个好的解决方案,主要是因为这些服务器将安装在我们的基础设施之外。

0 投票
3 回答
871 浏览

wpf - IoC 和用户界面

我正在尝试在我的应用程序中使用 IoC 进行依赖注入的最佳方式,但是我有一个小问题。

我在 WPF 应用程序中使用 MVP 模式的松散实现。本质上,演示者类被实例化,视图和任务(例如 EmployeePresenter 的 IEmployeeView 和 IEmployeeTask)被注入到演示者中。

我想使用 IoC 容器(我正在尝试 Unity,尽管我猜这也会发生在其他人身上,例如 ninject 或 Structure Map)而不是手动注入这些实例,但是如果演示者是创建的(或从IoC 容器)在异步委托调用或事件线程(例如非 STA 线程)上创建 WPF 窗口的新实例会引发以下异常:

当前构建操作(构建键 Build Key[ namespace .Window1, null])失败:调用线程必须是 STA,因为许多 UI 组件都需要这个。

现在,我知道新窗口实例等需要是 STA,但是即使必须在 STA 线程上创建 UI,是否可以使用 IoC 容器进行依赖注入?

从这个问题来看,被解析的类/类型似乎是在解析时实例化的,而不是在其注册时...

0 投票
2 回答
759 浏览

.net - Visual C++ GUI 应用程序卡在 MTA 模式

我有一个 C++ gui 项目表现出一些奇怪的行为。在我的机器上,代码编译并运行得很好。但是,在另一台机器上,代码编译但最终以某种方式在 MTA 中运行。显然,在 MTA 中会导致 GUI 出现各种运行时问题。这是我的主要内容:

我可以在 main 的第一行放置一个断点来检查公寓状态,并且在正确构建/执行的机器上,它将是“STA”,正如预期的那样。但是,在有问题的机器上,它将是“MTA”。我什至可以尝试将公寓模式切换到 STA,但没有效果。

我已经尝试在编译之前删除调试/发布目录并清理项目,在没有附加调试器的情况下运行,都无济于事。我无法确定哪些机器工作和哪些不工作的任何模式。如果我在工作机器上编译 exe 并将其带到有问题的机器上,它将正确执行,所以我怀疑这在某种程度上是构建环境问题。所涉及的所有机器都运行带有 Visual Studio 2008 标准的 Windows XP。有任何想法吗?

0 投票
3 回答
1116 浏览

multithreading - 为什么在 STA 线程下运行时未引发此 COM 互操作事件?

有人可以解释为什么在下面的代码中使用 STA 线程时没有引发事件“OnNewMail”吗?该程序尝试使用 Redemption 库来拦截传入的 Outlook 邮件。

0 投票
2 回答
1078 浏览

wcf - 将 REST/WCF 作为 STA 而不是用于 COM 的 MTA 运行

是否可以将REST (WCF) 服务配置为作为STA而不是MTA运行?

为了运行旧的 COM 对象,需要这种方法。为了将 ASMX Web 服务配置为作为 STA 而不是 MTA 运行,有一种可用的解决方法,它使用 HTTPHandler 来强制 Web 服务作为 STA 运行。

Jeff Prosise 的一篇文章http://msdn.microsoft.com/en-us/magazine/cc163544.aspx详细介绍了解决方法以及如何应用它。将相同的 HTTPHandler 应用于基于 REST 的 WCF 服务(使用Visual Studio 中的Create New ADO.NET Data Service)会在调用 WebServiceHandlerFactory 时产生错误(它正在传递 HTTPContext、URL 等)。

该处理程序适用于 ASMX Web 服务,我可以添加一个 WebMethod,将线程模型作为 STA 返回。但是,即使在设置 ASPCompatibility(在web.config类级别和类级别)之后,自定义 HTTPHandler 在尝试使用 REST 服务时总是会在同一点产生错误。我没有配置任何端点,因为我正在使用带有几个“服务操作员”方法的基本 REST 服务。错误是:

无法将“System.Web.Compilation.BuildResultCustomString”类型的对象转换为“System.Web.Compilation.BuildResultCompiledType”类型。

0 投票
3 回答
8855 浏览

.net - STA、MTA 和 OLE 的噩梦

我必须将 .NET 应用程序作为插件包含到另一个 .NET 应用程序中。插件接口要求我从模板表单继承。然后在加载插件时将表单附加到 MDI 中。

到目前为止一切正常,但是每当我注册拖放事件时,为组合框设置自动完成模式或在其他各种情况下,我都会收到以下异常:

...在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute ...

主应用程序在 MTA 中运行并由另一家公司开发,因此我无能为力。

我试图在 STA 线程中做导致这些异常的事情,但这也没有解决问题。

有没有人遇到过同样的情况?我能做些什么来解决这个问题吗?

0 投票
1 回答
720 浏览

f# - STATHREAD 作为 F# 中的异步工作流

考虑以下代码片段:

如果windowsProcess需要STATHREAD怎么办?这种结构有可能吗?

0 投票
1 回答
1003 浏览

com - 挂钩线程退出

有没有办法让我挂钩托管线程的退出(即在线程退出之前在线程上运行一些代码?)

我开发了一种用于挂钩线程退出的机制,该机制适用于某些线程。第 1 步:开发一个“挂钩”STA COM 类,该类接受一个回调函数并在其析构函数中调用它。第 2 步:在我要挂钩的线程上创建此对象的 ThreadStatic 实例,并将对象传递给转换为非托管函数指针的托管委托。然后在线程退出时调用委托(因为 CLR 在所有 STA COM RCW 上调用 IUnknown::Release 作为线程退出的一部分)。

例如,这种机制适用于我使用 Thread 类在代码中创建的工作线程。

但是,它似乎不适用于应用程序的主线程(无论是控制台还是 Windows 应用程序)。'hook' COM 对象似乎在关闭过程中被删除得太晚,并且尝试调用委托失败。

(我想实现这个工具的原因是我可以在退出线程上运行一些本机 COM 代码,这些代码与在线程上创建的 STA COM 对象一起工作,在它“为时已晚”之前(即在线程退出之前,并且不再可能在该线程上使用 STA COM 对象。))