我有一个 STA COM 组件,它被放入 COM+ 应用程序中。客户端在该组件中创建该类的多个实例并并行调用它们的方法。该类已正确注册 - 相应类 ID 的“ThreadingModel”为“Apartment”。
我看到在组件内部并行执行同一个类的同一个方法的多个调用——在实际的组件代码中。它们在同一个进程中执行,但在不同的线程中执行。
这是怎么回事? COM+ 是否忽略了线程模型? STA 模型不应该一次只允许执行一个调用吗?
最佳答案
为了避免混淆,我不会在这个答案中使用术语“对象”。相反,让我们使用“类”和“实例”。我相信我们都了解它们之间的区别。
用“Apartment”的 ThreadingModel 标记您的 COM 类意味着它的实例将被加载到 STA 中。创建这些实例的过程将决定它们是全部进入同一个 STA,还是进入不同的 STA。
正如您所发现的,COM+ 已将多个实例加载到单独的 STA 中。
您使用 STA 获得的保证是单个实例永远不会被多个线程同时访问。同一类的不同实例,如果它们被加载到不同的 STA,当然可以同时被不同的线程访问。
所以 STA 实际上是一种保护实例数据的方法。不是你的类(class)数据。您必须保护 COM 代码中的任何“共享”或“静态”数据。
关于windows - 为什么 COM+ 忽略单元线程模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/861871/