繁体   English   中英

对象公寓vs螺纹公寓

[英]Object apartment vs Thread apartment

我读到了关于公寓模型的信息,但是当我试图理解以下内容时,我仍然感到困惑:他的公寓决定了公寓模型? 它是线程的公寓还是创建对象的公寓?
请考虑以下情形:

  1. 我创建了C ++ ATL COM dll,只有一个接口是ISimpleCom ,我有一个类实现接口只有一个方法test(); 此类公开继承自设置STA公寓的CComObjectRootEx<CComSingleThreadModel>

  2. 在C#WinForms项目中引用此DLL,并在MTA线程(而不是UI线程)上创建SimpleCom对象。 问题是:让我们说这个对象的UI线程调用test() ,它会被编组到创建该对象的线程还是会在UI线程上执行?

    • 如果它跟随对象COM公寓,则应该将该调用封送到创建该对象的线程,因为它是STA对象。
    • 如果它跟随创建MTA的线程公寓,它应该在UI线程上执行。

哪一个是正确的?

简单的规则:

  • 线程可能是零或一个公寓的成员
  • 单线程单元(STA)由一个或多个线程的单线程MTA组成,但每个进程最多只能有一个MTA
  • 线程在COM初始化时“加入”公寓

因此,一段代码在STA(在STA线程上)或在MTA中执行,或者该线程尚未使用COM初始化。 当您通过COM实例化对象时,COM会将公寓模型与调用API的公寓类型相匹配。

此类公开继承自设置STA公寓的CComObjectRootEx。

不。这与设置公寓模型无关。 CComSingleThreadModel说这个类使用简单的base,这对于在STA上运行的对象很有用 - 特别是在访问对象的引用计数器时它不会使用InterlockedXxx API或关键部分,因为假定该类存在于单个线程中。 这确实设置了COM类的公寓模型,它并不表示该类是在STA上运行的,这只是提供了合适的基类。

ATL COM DLL托管类的公寓模型将在.RGS文件上显示,与COM类关联,并将与DLL注册合并到注册表中。 如果这是“公寓”型号那么......

在MTA线程(而不是UI线程)上创建SimpleCom对象。

... COM将看到它无法直接在调用线程上实例化,因为该线程属于MTA。 因此,COM将在工作者STA线程上实例化,并将创建一个代理/存根对,以将请求的接口称为调用者MTA。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM