【问题标题】:Using legacy COM component in C# multithreaded Environment在 C# 多线程环境中使用旧版 COM 组件
【发布时间】:2009-11-28 19:18:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# .net multithreading com legacy


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多