在C#多线程环境中使用传统的COM组件

3
我有一个传统的COM组件,我的任务是编写Web服务来包装COM并启用并发非阻塞调用。
首先,因为COM对象本身是无状态的,我决定使用[ThreadStatic]属性,这样每个线程将拥有自己的COM对象实例,以防止使用lock {}语句并启用真正的并发处理,但似乎所有调用仍然是同步进行的。
我编写了一个测试代码,使用for{}循环同步运行COM组件的方法,然后添加第二个线程,对另一个COM对象实例执行完全相同的操作,但我没有看到任何变化,X次调用总是消耗Y时间跨度,无论线程计数如何。就像有一个静态锁或类似的东西...
尽管如此,单独的进程可以真正并发地处理每个调用。是什么阻止了单独的线程表现出相同的行为?
我该怎么做才能启用对COM组件的真正并发调用?
1个回答

3
COM是线程感知的,会遵守由coclass请求的线程模型。它通过注册表中的ThreadingModel值发布其线程要求。如果设置为“Apartment”(或缺失),COM将确保所有方法调用都来自单线程公寓,方法是返回您QI的接口的代理。代理确保调用被编组到正确的线程。
您可以作弊并在STA线程中使用创建coclass时获取的接口指针进行调用而无需编组。鉴于coclass已经表示它无法进行多线程操作,这种方法极不可能正常工作。您只会随意破坏内部状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接