Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#多线程环境中使用遗留COM组件_C#_.net_Multithreading_Com_Legacy - Fatal编程技术网

在C#多线程环境中使用遗留COM组件

在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并支持并发非阻塞调用的web服务

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

我编写了一个测试代码,从COM组件运行一个与for{}循环同步的方法,然后添加了第二个执行相同操作的线程到COM对象的另一个实例,我没有看到任何更改,X调用总是消耗Y时间跨度,不管线程数如何。好像有一个静电锁或什么的

尽管如此,单独的进程仍然可以并发地处理每个调用。是什么阻止了不同线程的行为相同


如何才能启用对COM组件的真正并发调用?

COM支持线程,并将遵守coclass请求的线程模型。它使用注册表中的ThreadingModel值发布其线程需求。如果将其设置为“单元”(或缺少),COM将通过返回所需接口的代理,确保所有方法调用都是从单线程单元进行的。代理确保将调用封送到正确的线程

您可以欺骗并使用在STA线程中创建coclass时得到的接口指针,并在不封送的情况下进行调用。考虑到coclass已经说过它不能实现多线程,这不太可能正常工作。您将随机破坏内部状态