[英]Object apartment vs Thread apartment
我读到了关于公寓模型的信息,但是当我试图理解以下内容时,我仍然感到困惑:他的公寓决定了公寓模型? 它是线程的公寓还是创建对象的公寓?
请考虑以下情形:
我创建了C ++ ATL COM dll,只有一个接口是ISimpleCom
,我有一个类实现接口只有一个方法test();
此类公开继承自设置STA公寓的CComObjectRootEx<CComSingleThreadModel>
。
在C#WinForms项目中引用此DLL,并在MTA线程(而不是UI线程)上创建SimpleCom
对象。 问题是:让我们说这个对象的UI线程调用test()
,它会被编组到创建该对象的线程还是会在UI线程上执行?
哪一个是正确的?
简单的规则:
因此,一段代码在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.