问题标签 [mta]

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 投票
2 回答
2365 浏览

c# - 来自 MTA 的 STA 呼叫

我刚刚开始处理 STA/MTA 问题,因此为问题的简单性道歉。我在这里的阶梯底部找不到我能真正理解的答案。

我正在为另一款软件编写插件,并在工作线程中发现我需要创建一些 UI 元素。我知道我不能从工作线程内部执行此操作,因为它不是 STA 线程,并且我需要返回主(或只是另一个?)STA 线程来创建 UI 元素。一些澄清将有很大帮助。

  1. 是否所有 STA 线程都具有相同的“权限”,即如果主线程是 STA 并创建一个窗口,则向其添加一些 UI 元素。然后产生另一个 STA 线程,第二个线程同样创建一些 UI 元素,它们是否在同一个“空间”中执行(糟糕的词选择,但我不知道还能使用什么)并且可以访问彼此的 UI 元素不会造成死亡和破坏?或者我是否需要明确地跳回主/原始 STA 线程并且只从那个(不仅仅是任何)STA 线程创建 UI 元素?

  2. 如果是这种情况(只允许 1 个 STA 线程制作 UI 元素),我该如何正确地做到这一点?我看过很多与此相关的帖子,但由于某种原因,我不太了解发生了什么,并且希望得到一个真正简单的答案。

请不要'这是一种很酷的巧妙方法......'我只需要在执行点的简单方法,如果这是必要的,我需要一些 UI 元素跳回主 STA 线程。

如果没有必要,那么我只会将该工作线程设为 STA 线程并继续进行,这样公平吗?还是我在招惹灾难?

0 投票
1 回答
365 浏览

wpf - ElementHost 在 MTAThread 中不起作用

我有 WPF 用户控件,它需要托管在MTAThread的 Windows 窗体中的 Windows 窗体中。解决方案应该适用于 STAThread 和 MTAThread。而且从技术上讲,在生产环境中没有更改公寓状态的选项。

程序.cs

在这种情况下,现在主机被添加到控件中,因为计数增加并且它不会在 MTAThread 中引发任何异常。但是 WPF 用户控件没有呈现。但是,在 STAThread 中,它抛出异常“调用线程无法访问此对象......”

对此的任何帮助将不胜感激。

0 投票
3 回答
4467 浏览

c# - 从多个线程调用 STA COM 对象的 MTA 控制台应用程序

尽管有很多关于 COM 和 STA/MTA 的问题(例如这里),但其中大多数都在谈论具有 UI 的应用程序。但是,我有以下设置:

  • 一个控制台应用程序,默认情况下是多线程单元(Main() 显式具有该[MTAThread]属性)。
  • 主线程产生一些工作线程。
  • 主线程实例化一个单线程 COM 对象。
  • 主线程调用 Console.ReadLine() 直到用户点击“q”,之后应用程序终止。

几个问题:

  • 许多地方都提到了COM 对象需要消息泵。我是否需要为主线程手动创建一个消息泵,或者 CLR 会在新的 STA 线程上为我创建它,正如这个问题所暗示的那样?
  • 只是为了确保 - 假设 CLR 自动创建必要的管道,然后我可以使用来自任何工作线程的 COM 对象而无需显式同步吗?
  • 以下哪项在性能方面更好:
    • 让 CLR 负责与 COM 对象之间的封送处理。
    • 在单独的 STA 线程上显式实例化对象,并让其他线程通过例如ConcurrentQueue.
0 投票
1 回答
453 浏览

com - 带有 STA 和 MTA 的 OPC 客户端示例

在哪里可以找到有关用于 OPC 客户端的 COM 线程模型的信息,作为 OPC 实验室认证过程的一部分,我必须验证 OPC 客户端可以使用不同的 COM 线程模型实现,例如单线程单元 (STA) 和多线程单元 ( MTA)应该能够连接到服务器并读取数据而不会失败。

在客户端下用于测试,但不确定客户端是用什么线程模型实现的。

  • Kepware - OPC 快速客户端
  • Softing-OPC 演示客户端
  • Indusoft-Webstudio
  • Matrikon OPC 浏览器
  • OPC Foundation - 示例客户端
0 投票
1 回答
122 浏览

winapi - MTA COM 服务器的实现

我找不到任何关于符合 MTA 的 COM 的先决条件的源代码。我尝试将对象的 ThreadingModel 注册表项从 Apartment 更改为 Both,当辅助线程在访问任何数据之前调用该方法时会导致崩溃。

如果 STA COM 需要消息泵,MTA COM 对象需要什么样的管道代码?

0 投票
1 回答
52 浏览

wcf - ThreadingModel Free 使 WCF 服务崩溃

我有一个运行一些 COM 对象的非单例 WCF(独立)服务。在非 WCF 环境中,使用 Thread.Start,这些 COM 对象在不同的​​线程中愉快地并行运行,利用所有 CPU 并在大约同一时间完成。

但是,当我尝试在特定的 WCF 服务中使用它们时,事情变得很奇怪。

当注册表中的ApartmentState设置为Both时,WCF 工作,但任务似乎是串行的,等待彼此的完成。CPU 使用率永远不会超过 1 个 CPU 的份额。就像它被迫在STA中运行一样。

当注册表中的ApartmentState设置为Free时,它​​会崩溃。

我只是不明白。这是某种管道阻碍吗?

我的 WCF 服务类具有以下属性:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any, InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]

COM 对象是静态的/全局的。

0 投票
1 回答
2429 浏览

c# - 在 STAThread 和 MTAThread 之间切换和内存泄漏

在寻找 vb.net WebService 中的内存泄漏时,我检测到终结器被阻塞,以及一些从未释放的对象(例如 System.Threading.ReaderWriterLock)

谷歌告诉我这可能是因为 STAThread 属性是在我的 main 方法上设置的。我花了很长时间才发现 VB.net 默认使用 STA,而 c# 使用 MTA。

当我将 MTAThread-Attribute 添加到我的 Main 方法时,一切正常并且对象被释放。因此,如果我理解正确,Finalizer-Thread 在 STA 模式下被阻止。

到目前为止一切都很好,但老实说,我今天第一次听说 STA 和 MTA。我可以不加思索地在 STA 和 MTA 之间切换吗?

更新 我仍然不确定是否可以在不破坏代码的情况下在 MTA 和 STA 之间切换。这里还有一些想法

  • 我不在我的代码中使用 COM 对象。
  • 但是我正在使用的其他一些库似乎在后台使用它们,例如 OracleCommand
  • 我的应用程序是用 vb.net 编写的,因此偶然将其设置为 STA-Appartment,因为这是 vb.net 默认设置,我在开发时并不知道
  • 如果我用 c# 编写我的应用程序,它会默认设置为 MTA
  • 那么我是否需要关心在后台使用的 COM 对象?
0 投票
0 回答
1055 浏览

c# - 我在 wpf 中创建新的 MainWindow 时出错

我的 wpf 项目中有一个错误。当我想在以下代码中从 MainWindow 新建一个时:

我懂了:

PresentationCore.dll 中发生了“System.InvalidOperationException”类型的未处理异常附加信息:调用线程必须是 STA,因为许多 UI 组件都需要这个。

但是在此错误之后,我删除了 App() 和 App.xaml 中的代码

但我看到了另一个问题。请看下文。

PresentationFramework.dll 中出现“System.NotImplementedException”类型的第一次机会异常

附加信息:方法或操作未实现。

在那之后:

PresentationFramework.dll 中出现“System.Windows.Markup.XamlParseException”类型的未处理异常

附加信息:方法或操作未实现。

有什么问题?

0 投票
0 回答
378 浏览

c# - c#强制从MTA线程调用进程外COM服务器回调到同一个线程

我正在编写一个由第三方应用程序调用的 DLL。DLL 从 MTA 线程调用,任何对第三方应用程序的调用都必须在同一线程上完成。从我的应用程序中,我需要调用进程外的 COM 服务器,并且我想使用传递给 COM 服务器的对象从该 COM 服务器回调第三方应用程序。

例如

现在,如果我可以将线程更改为 STA,它会正常工作,但不幸的是,这超出了我的控制范围。

有什么简单的方法可以强制从 COM 服务器返回的调用位于同一个线程上吗?

请注意,调用应用程序不是 Windows 窗体或 WPF 应用程序,它是无窗口服务。

我唯一能想到的就是创建一个新的工作线程,我从它调用 COM 服务器并实现我自己的事件队列,然后循环等待 EntryPoint 中的 API 调用。然后,我可以将 API 调用的委托从工作线程放到事件队列中,确保在处理 EntryPoint 中的队列时它们都从正确的线程中调用。

对于应该很常见的事情,这似乎是一个非常丑陋和复杂的解决方案......是否有一个简单的(r)解决方案?

0 投票
2 回答
667 浏览

com - STA 或 MTA 用于间接使用的 COM 对象

我想我了解公寓的概念以及为什么要使用 STA 或 MTA,但是出现了一个问题,到目前为止我还没有找到解决方案。

如果我的应用程序在后台使用 COM 对象,例如来自第三方库,我如何知道我是否可以使用 MultiThreaded-Appartment (MTA)?在那种情况下,我不知道这些对象是否是线程安全的,所以为了安全起见,我是否需要使用 STA?