我们在in-proc-server(.dll)中给出了线程模型“Both”。我注意到注册表编辑器中的线程模型。我们知道使用“Both”创建的com对象将采用线程的线程模型创建对象。我在STA线程中实例化对象,以确保对com对象的调用应该只通过一个线程。我正在以子序列方式从子线程调用此对象的方法,其中对象实际上是在主(STA)线程中创建的
它会产生任何副作用吗?
我没有得到任何错误,并且当我在子线程中使用对象时没有任何编组(GIT)时执行正常。
现在我的疑问是它是怎么发生的。当我谷歌时,我没有得到任何明星方式的回答。请给我一个简短的描述
根据我的理解,如果对象支持“STA”,则需要对对象进行编组吗?这里我们的对象支持“Both”。
答案 0 :(得分:2)
见this very good explanation。是否使用编组将取决于对象和呼叫者是否在同一个公寓中。如果我说得对,你调用CoInitializeEx()
将一个线程放入STA,然后从该线程调用CoCreateInstance()
- 该对象将在同一个STA中创建,因此原始创建者线程将与之通信它直接。另一个线程将如何使用该对象将取决于公寓配置。从你的问题中不清楚另一个线程是否调用CoInitializeEx()
以及对象指针是如何传递给它的。如果你只是传递一个原始指针,那么就没有办法打开编组方式。
当您将指针传递给另一个线程时,您可能会遇到实际问题。 Part two of the above article说你永远不应该在公寓之间传递原始指针。但是看起来你的情况是该规则的一个例外。 COM类被标记为具有Both
线程模型,因此它必须是完全线程安全的,因此可以同时从多个线程调用其方法。我不确定这一点,但看起来你很安全。
答案 1 :(得分:0)
是的,因为您正在一个公寓中创建一个对象并在另一个公寓中调用方法。你还没有面临任何副作用。我认为因为你的对象很简单(没有回调,连接点等)。但它可能会改变。