Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与C中COM对象的STA关联的线程# C++中,当我调用CONPROLIALIZE()时,STA正在创建一个与线程“T”相关联的线程,它调用“CONPREALALIZE()”。现在,如果我理解正确,当t创建COM对象时,该对象与与t关联的STA关联,这意味着只有“t”可以调用该对象_C#_Multithreading_Com_Interop - Fatal编程技术网

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

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同步,调用始终由线程传递 它属于对象的单元,对象的接口 实现不需要提供同

我的问题是C#会发生什么?谁调用CoInitialize()

一些背景:我的问题来自线程模拟问题。一个线程被模拟给一个用户,然后它调用COM对象,调用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
的调用是否应该在主线程上进行,或者从线程的委托内部进行。