3

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

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

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

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

我可以做些什么来启用对 COM 组件的真正并发调用?

4

1 回答 1

3

COM 是线程感知的,并将遵循 coclass 请求的线程模型。它使用注册表中的 ThreadingModel 值发布其线程要求。如果它设置为“Apartment”(或缺失),COM 将通过返回您 QI 接口的代理来确保所有方法调用都是从单线程单元进行的。代理确保调用被编组到正确的线程。

您可以作弊并使用在 STA 线程中创建 coclass 时获得的接口指针,并在不进行编组的情况下进行调用。鉴于 coclass 已经说过它不能进行多线程处理,因此这不太可能正常工作。你只会随机破坏内部状态。

于 2009-11-28T19:35:36.650 回答