我有遗留的COM组件,我的任务是编写包装COM并启用并发非阻塞调用的Web服务。

首先,因为COM对象本身是无状态的,所以我决定使用[ThreadStatic]属性,因此每个线程都有自己的COM对象实例,以防止使用lock {}语句并启用真正的并发处理,但似乎所有的调用仍然是同步的。

我编写了一个测试代码,它运行COM组件的一个方法与for {}循环同步,然后添加第二个线程,它完全相同但是COM对象的另一个实例,我看到没有变化,X调用无论线程数是多少,总是消耗Y倍。就像有一个静态锁或什么......

尽管如此,单独的进程可以同时处理每个调用以实现真实。什么阻止单独的线程表现相同?

如何启用对COM组件的实际并发调用?

有帮助吗?

解决方案

COM具有线程感知功能,并且将遵循coclass请求的线程模型。它使用ThreadingModel值在注册表中发布其线程需求。如果设置为“公寓”,则设置为“公寓”。 (或者缺失),COM将通过返回QI接口的代理来确保所有方法调用都来自单线程单元。代理确保将调用封送到正确的线程。

你可以欺骗并使用你在STA线程中创建coclass并在没有封送的情况下进行调用时获得的接口指针。鉴于coclass已经表示它不具备多线程功能,因此这种方法不太可能正常工作。你只是随意腐败内部状态。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top