windows - 为什么 COM+ 忽略单元线程模型?

标签 windows com interop com+

我有一个 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/

相关文章:

c# - 如何消除尾随的空行/列

windows - 为什么我们可以在 DISPATCH LEVEL 或更高级别从非分页池访问内存

c# - 在 Windows 7(64 位)中注册 COM 对象

c++ - 访问另一个程序的值

c++ - 了解指针引用的工作原理

powershell - 在PowerShell中的mshtml.HTMLDocumentClass对象上使用querySelectorAll会导致崩溃

c++ - Windows Messaging - 捕获来自另一个 API 的调用

javascript - 在 clojurescript 中调用自定义 javascript 函数

arrays - 多行批量创建数组

windows - 如何将特定文件从多个子文件夹移动到它们各自的父文件夹? (Windows 批处理)