与C#中COM对象的STA关联的线程

时间:2013-10-02 06:16:46

标签: c# multithreading com interop

在C ++中,当我调用CoInitialize()时,正在创建一个与调用“CoInitialize()”的线程t关联的STA。现在,如果我理解正确,当t创建COM对象时,该对象与与t关联的STA相关联,这意味着只有“t”才能调用此对象。

我的问题是C#会发生什么?谁打电话给CoInitialize()?

一些背景:我的问题来自线程模拟问题。一个线程被模拟给用户然后它调用COM对象,调用COM对象的线程是否真的是执行内部代码的线程(在COM对象内部没有新线程)。

非常感谢!

2 个答案:

答案 0 :(得分:2)

COM对象是单线程的,不能有多个线程。 STA负责COM组件的多个消费者的同步。

  

当多个客户端调用一个对象时,调用将在该队列中排队   消息队列和对象每次都会收到一个调用   公寓检索和发送消息。因为电话是   由COM同步,并且线程始终传递调用   属于对象的公寓,对象的界面   实现无需提供同步MSDN

STA和MTA

  

对于互操作性,公共语言运行库创建和   在调用COM对象时初始化公寓。托管线程   可以创建并输入包含的单线程单元(STA)   只有一个线程,或包含一个的多线程单元(MTA)   或更多线程。当COM公寓和线程生成的公寓   兼容,COM允许调用线程直接进行调用   到COM对象。如果公寓不兼容,COM会创建一个   兼容的公寓和编组所有通过代理在新的呼叫   公寓,reference

CLR调用CoInitializeEx

  

运行时调用CoInitializeEx将COM公寓初始化为   无论是MTA还是STA公寓。在.NET Framework 2.0版中,   托管线程如果其公寓状态已初始化为MTA   在启动线程之前未设置。使用SetApartmentState   或TrySetApartmentState方法来设置之前的公寓状态   启动帖子reference;

答案 1 :(得分:0)

为了进一步回答您的问题,在C#中,CLR代表您致电CoInitialize。您可以使用[STAThread]方法中的main属性设置线程模型,也可以设置线程的ApartmentState property