分配给STA的COM公开.NET对象是否可以具有多个线程?

时间:2019-01-10 17:03:16

标签: c# multithreading com interop

在过去的几天里,我读了一些关于COM和互操作性的很好的文章。 但是有两个说法让我有些困惑。

microsoft interop documentation说:

  

导出的托管服务器,其类型库已由   Regasm.exe(程序集注册工具)具有ThreadingModel注册表   条目设置为两者。该值表示服务器可以   在单线程单元(STA)或多线程中激活   公寓(MTA)。服务器对象与   其调用方,如下表所示。   enter image description here

microsoft threading documentation中,我发现:

  

暴露给COM的托管对象的行为就像   聚合了自由线程封送处理程序。换句话说,它们可以是   从任意COM公寓以自由线程方式调用。唯一的   没有这种自由线程行为的托管对象是   从ServicedComponent派生的那些对象,或者   StandardOleMarshalObject。

     

...

     

当非托管线程通过(例如)   COM可调用包装器,系统检查该线程的本地存储   线程以查找内部托管线程对象。如果找到一个   运行时已经知道此线程。如果找不到一个   但是,运行时会构建一个新的Thread对象并将其安装在   该线程的线程本地存储。

也许我不明白好像他们聚合了自由线程封送处理程序的意思。 但这是否意味着在STA中创建.NET对象时,它仍然像具有Threading Model 'Free' 的对象一样工作吗?

以我的理解,大致而言,以上所有引用均表示以下含义: 不管调用线程的公寓类型(STA,MTA)如何,.NET对象都可以创建多个线程,因为它由CLR管理,因此不必遵循COM线程模型规则。

或更简单:在我的托管.NET库中,即使调用进程是单线程VB6应用程序,我也可以创建任意数量的线程。

这是正确的吗?

0 个答案:

没有答案