.net - COM 多线程支持

标签 .net visual-studio com

第一次使用 COM
我有这个 COM dll,比如 ABCServer.dll,我创建了一个 RCW 并在我的项目中添加了对它的引用。现在我的应用程序创建了几个线程,每个线程从 COM dll 创建某些类并使用它们。但是随后每个线程都在等待,而其他线程正在使用 COM dll 中的某个类。

修改我的应用程序的全部目的是在其上启用多线程。现在,当我身边发生多线程时,COM 导致它是顺序的。虽然每个线程都在创建新实例,但为什么还要等待其他线程被处理?

最佳答案

如果您的 COM 组件被标记为 STA (single-threaded apartment)那么你就没有办法让它成为多线程的了;该组件的要求是对它的所有调用都序列化到 STA 所在的线程上,并且 COM 会自动为您处理。

也就是说,如果您的组件是 STA 组件(看起来确实如此)并且您不能将其更改为 multi-threaded apartment component (MTA)甚至更好,free-threaded (所以公寓之间根本没有编码)因为a)它是用VB6编写的,或者b)它是一个第三方dll,那么使用某种队列模型可能会更好。

基本上,让您的所有其他工作异步运行,然后有一个线程(或进程,由您决定),它将消耗请求以尽可能快地一次调用该组件(请注意,您可以实例化此组件在多个线程中的多个实例,您只需确保将 ApartmentState property on the Thread class 设置为 ApartmentState.STA ),然后在调用完成时发布事件/回调并异步继续您的其他工作。

它基本上就像有两个生产者/消费者实现,一个将调用分派(dispatch)给 COM 组件,另一个在完成后分派(dispatch)结果。

关于.net - COM 多线程支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7930627/

相关文章:

C# 如何访问已实现的接口(interface)中不存在的对象属性

visual-studio - 如何防止Solution Explorer在编辑器(VS 2015)中自动打开所选项目?

c# - 将文件从 C# Windows 窗体中的文件夹填充到列表框中

c# - 在 C# 中使用 COM 互操作时的 RCW 和引用计数

winapi - 在 Rust 中实现 IWbemObjectSink 接口(interface)

c# - "Copy if newer"文件更新时为什么不复制文件?

c# - 指南针/飞机仪表控制

c# - 任何用于 .NET 的 NIO 框架?

c++ - 并发无序映射查找线程调用的函数是否安全?

python - 使用 win32inet.WinHttpGetProxyForUrl 的正确方法是什么