C# 与C中COM对象的STA关联的线程# C++中,当我调用CONPROLIALIZE()时,STA正在创建一个与线程“T”相关联的线程,它调用“CONPREALALIZE()”。现在,如果我理解正确,当t创建COM对象时,该对象与与t关联的STA关联,这意味着只有“t”可以调用该对象
我的问题是C#会发生什么?谁调用CoInitialize() 一些背景:我的问题来自线程模拟问题。一个线程被模拟给一个用户,然后它调用COM对象,调用COM对象的线程是否真的是执行内部代码的线程(COM对象内部没有新线程)C# 与C中COM对象的STA关联的线程# C++中,当我调用CONPROLIALIZE()时,STA正在创建一个与线程“T”相关联的线程,它调用“CONPREALALIZE()”。现在,如果我理解正确,当t创建COM对象时,该对象与与t关联的STA关联,这意味着只有“t”可以调用该对象,c#,multithreading,com,interop,C#,Multithreading,Com,Interop,我的问题是C#会发生什么?谁调用CoInitialize() 一些背景:我的问题来自线程模拟问题。一个线程被模拟给一个用户,然后它调用COM对象,调用COM对象的线程是否真的是执行内部代码的线程(COM对象内部没有新线程) 非常感谢 COM对象是单线程的,不能有多个线程。STA负责COM组件的多个使用者的同步 当多个客户端调用一个对象时,调用将在 消息队列和对象将在每次调用时接收调用 公寓检索和发送消息。因为电话是 由COM同步,调用始终由线程传递 它属于对象的单元,对象的接口 实现不需要提供同
非常感谢 COM对象是单线程的,不能有多个线程。STA负责COM组件的多个使用者的同步 当多个客户端调用一个对象时,调用将在 消息队列和对象将在每次调用时接收调用 公寓检索和发送消息。因为电话是 由COM同步,调用始终由线程传递 它属于对象的单元,对象的接口 实现不需要提供同步 STA和MTA 为了实现互操作性,公共语言运行库创建和 调用COM对象时初始化单元。托管线程 可以创建并输入包含以下内容的单线程单元(STA) 只有一个线程,或包含一个线程的多线程单元(MTA) 一个或多个线程。当COM单元和线程生成单元时 COM允许调用线程直接进行调用 指向COM对象。如果公寓不兼容,COM将创建一个 兼容单元并通过新单元中的代理封送所有调用 公寓 CLR调用CoInitializeX 运行时调用CoInitializeEx将COM单元初始化为 MTA或STA公寓。在.NET Framework 2.0版中, 如果托管线程的单元状态已更改,则将其初始化为MTA 未在开始线程之前设置。使用SetApartmentState 或者使用TrySetApartmentState方法在之前设置公寓状态 启动线程
为了进一步回答您的问题,在C#中,CLR代表您调用
CoInitialize
。您可以使用main
方法上的[STAThread]
属性,或者通过设置线程的ApartmentState
来设置线程模型。因此每个COM对象(在STA中)都有一个只用于执行其功能的线程,如活动对象?!或者是我的一个线程调用了“CoInitialize()”并创建了该对象?不,STA中的所有COM对象都共享一个线程,即调用CoInitialize()
的线程。亲爱的投票人,如果你投了反对票,请说明原因,否则你的反对票是无用的,没有建设性的。请看一看。在调用thread.Start
之前,我无法确定对CoInitializeEx
的调用是否应该在主线程上进行,或者从线程的委托内部进行。