在C ++中,当我调用CoInitialize()时,正在创建一个与调用“CoInitialize()”的线程t关联的STA。现在,如果我理解正确,当t创建COM对象时,该对象与与t关联的STA相关联,这意味着只有“t”才能调用此对象。
我的问题是C#会发生什么?谁打电话给CoInitialize()?
一些背景:我的问题来自线程模拟问题。一个线程被模拟给用户然后它调用COM对象,调用COM对象的线程是否真的是执行内部代码的线程(在COM对象内部没有新线程)。
非常感谢!
答案 0 :(得分:2)
COM对象是单线程的,不能有多个线程。 STA负责COM组件的多个消费者的同步。
当多个客户端调用一个对象时,调用将在该队列中排队 消息队列和对象每次都会收到一个调用 公寓检索和发送消息。因为电话是 由COM同步,并且线程始终传递调用 属于对象的公寓,对象的界面 实现无需提供同步MSDN。
对于互操作性,公共语言运行库创建和 在调用COM对象时初始化公寓。托管线程 可以创建并输入包含的单线程单元(STA) 只有一个线程,或包含一个的多线程单元(MTA) 或更多线程。当COM公寓和线程生成的公寓 兼容,COM允许调用线程直接进行调用 到COM对象。如果公寓不兼容,COM会创建一个 兼容的公寓和编组所有通过代理在新的呼叫 公寓,reference
运行时调用CoInitializeEx将COM公寓初始化为 无论是MTA还是STA公寓。在.NET Framework 2.0版中, 托管线程如果其公寓状态已初始化为MTA 在启动线程之前未设置。使用SetApartmentState 或TrySetApartmentState方法来设置之前的公寓状态 启动帖子reference;
答案 1 :(得分:0)
为了进一步回答您的问题,在C#中,CLR代表您致电CoInitialize
。您可以使用[STAThread]
方法中的main
属性设置线程模型,也可以设置线程的ApartmentState
property。