第一次使用COM我有这个 COM dll,比如 ABCServer.dll,我创建了一个 RCW 并在我的项目中添加了对它的引用。现在,我的应用程序创建了多个线程,每个线程从 COM dll 创建某些类并使用它们。但是,当其他线程正在处理 COM dll 中的某个类时,每个线程都在等待。
修改我的应用程序的全部目的是在其上启用多线程。现在,当我这边发生多线程时,COM 会导致它是顺序的。虽然每个线程都在创建新实例,但为什么它们要等待其他线程被处理呢?
如果您的 COM 组件被标记为STA(单线程单元) http://msdn.microsoft.com/en-us/library/windows/desktop/ms680112%28v=vs.85%29.aspx那么你就无法使它成为多线程;该组件的要求是对它的所有调用都序列化到 STA 所在的线程上,并且 COM 会自动为您处理该问题。
也就是说,如果您的组件是 STA 组件(看起来确实如此)并且您无法将其更改为多线程单元组件 (MTA) http://msdn.microsoft.com/en-us/library/windows/desktop/ms693421%28v=vs.85%29.aspx甚至更好,自由线程 https://stackoverflow.com/questions/3892259/difference-between-free-threaded-and-thread-safe(所以公寓之间根本没有编组)因为a)它是用VB6编写的,或者b)它是第三方dll,那么您最好使用某种队列模型。
基本上,拥有你所有的other工作异步运行,然后有一个线程(或进程,这取决于你),它将消耗一次调用该组件的请求,尽可能快(请注意,你可以在多个实例中实例化该组件的多个实例)线程,你只需要确保设置ApartmentState财产在Thread class http://msdn.microsoft.com/en-us/library/system.threading.thread.apartmentstate.aspx to ApartmentState.STA http://msdn.microsoft.com/en-us/library/system.threading.apartmentstate.aspx),然后在调用完成时发布事件/回调并异步继续您的其他工作。
它基本上就像有两个生产者/消费者实现,一个用于分派对 COM 组件的调用,另一个用于在完成后分派结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)