Tag: mta

Winforms:一个COM对象需要一个STAThread,另一个需要一个MTAThread。 我该如何使用它们?

我正在尝试使用两个COM组件构建Winforms应用程序。 但是,其中一个组件仅在使用[MTAThread] ,而另一个仅适用于[STAThread] 。 推荐的解决方案是什么?

与MTA线程相比,STA线程有哪些限制?

如果我们像这样创建一个线程STA: Thread.SetApartmentState(STA); 然后它无法运行标有[MTAThread]属性的代码。 我们在Windows和控制台应用程序中看到[STAThread] ,但我从未见过具有[MTAThread]属性的代码,并且不知道哪些.NET库使用此属性。 我的问题是,与具有MTA单元状态(自然.NET线程)的线程相比,具有设置为STA的单元状态的线程的限制是什么?

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

虽然有很多关于COM和STA / MTA的问题(例如这里 ),但大多数人都在讨论具有UI的应用程序。 但是,我有以下设置: 控制台应用程序,默认为Multi-Threaded Apartment(Main()显式具有[MTAThread]属性)。 主线程产生一些工作线程。 主线程实例化单线程COM对象。 主线程调用Console.ReadLine()直到用户点击’q’,然后应用程序终止。 几个问题: 许多地方都提到需要为COM对象提供消息泵 。 我是否需要为主线程手动创建消息泵,或者CLR是否会在新的STA线程上为我创建消息泵,正如这个问题所示? 只是为了确保 – 假设CLR自动创建必要的管道,然后我可以使用来自任何工作线程的COM对象而无需显式同步吗? 在性能方面,以下哪项更好: 让CLR负责处理来自COM对象的编组。 在单独的STA线程上显式实例化对象,并让其他线程通过例如ConcurrentQueue与之通信。