在C#多线程环境中使用遗留COM组件
我有一个遗留的COM组件,我的任务是编写包装COM并支持并发非阻塞调用的web服务 首先,因为COM对象本身是无状态的,所以我决定使用[ThreadStatic]属性,这样每个线程都有自己的COM对象实例,以防止使用lock{}语句并启用真正的并发处理,但似乎所有调用仍然是同步的 我编写了一个测试代码,从COM组件运行一个与for{}循环同步的方法,然后添加了第二个执行相同操作的线程到COM对象的另一个实例,我没有看到任何更改,X调用总是消耗Y时间跨度,不管线程数如何。好像有一个静电锁或什么的 尽管如此,单独的进程仍然可以并发地处理每个调用。是什么阻止了不同线程的行为相同在C#多线程环境中使用遗留COM组件,c#,.net,multithreading,com,legacy,C#,.net,Multithreading,Com,Legacy,我有一个遗留的COM组件,我的任务是编写包装COM并支持并发非阻塞调用的web服务 首先,因为COM对象本身是无状态的,所以我决定使用[ThreadStatic]属性,这样每个线程都有自己的COM对象实例,以防止使用lock{}语句并启用真正的并发处理,但似乎所有调用仍然是同步的 我编写了一个测试代码,从COM组件运行一个与for{}循环同步的方法,然后添加了第二个执行相同操作的线程到COM对象的另一个实例,我没有看到任何更改,X调用总是消耗Y时间跨度,不管线程数如何。好像有一个静电锁或什么的
如何才能启用对COM组件的真正并发调用?COM支持线程,并将遵守coclass请求的线程模型。它使用注册表中的ThreadingModel值发布其线程需求。如果将其设置为“单元”(或缺少),COM将通过返回所需接口的代理,确保所有方法调用都是从单线程单元进行的。代理确保将调用封送到正确的线程 您可以欺骗并使用在STA线程中创建coclass时得到的接口指针,并在不封送的情况下进行调用。考虑到coclass已经说过它不能实现多线程,这不太可能正常工作。您将随机破坏内部状态