gpt4 book ai didi

.net - COM 多线程支持

转载 作者:行者123 更新时间:2023-12-05 00:36:42 26 4
gpt4 key购买 nike

第一次使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com