gpt4 book ai didi

windows - 为什么我要使用 "Both"COM 线程模型而不是 "Free"?

转载 作者:可可西里 更新时间:2023-11-01 12:37:19 28 4
gpt4 key购买 nike

根据 this article如果我使用“两者”或“自由”线程模型注册我的 COM 对象,该对象必须是完全线程安全的。具体来说,所有对全局共享变量的访问都必须同步,所有对成员变量的访问也必须同步。这是很大的努力。

现在我明白能够将我的对象注册为使用“免费”线程模型是有利的,并且可能值得付出使其完全线程安全的代价。但是为什么我要做同样的事情并使用“两者”线程模型注册我的对象呢?会有什么好处?如何在“两者”和“免费”之间做出选择?

最佳答案

双线程模型

将组件标记为支持线程模型“Both”的主要原因是为了在从单线程单元 (STA) 调用组件时提高性能。

如果您将您的组件标记为 MTA 并且您的组件是从 STA 中创建的,那么您的组件将在单独的 MTA 单元中创建,并且 "resultant inter-apartment marshaling might degrade performance enough to negate all the work put into making an efficient, free-threaded component" .但是,如果您的组件的线程模型被标记为“两者”,那么它将在 STA 对象的单元内创建并直接访问。

因此,如果您认为可以从 STA(所有 VB6 COM 对象都是 STA)中调用您的组件,您可能希望将线程模型标记为“两者”。

关于 OLE Threading Models 的一篇很好的知识库文章.

自由线程模型

如果您的组件使用其他标记为“自由”的组件,您可能希望使用“自由”线程模型。如果您的组件被标记为“Both”,那么在 STA 和 MTA 中运行的“Both”组件之间可能会有过多的单元切换。作为一般规则,尝试创建尽可能靠近调用者的组件(即同一间公寓),同时在所有情况下都能正常运行。

另一种需要将您的组件标记为“免费”的情况是它显式阻塞(例如 Thread.Sleep)。如果该组件被标记为“两者”并在 STA 中实例化,则该组件将阻止 STA 消息泵。

其他注意事项和场景

如果您计划在 IIS 中使用该组件,则还有其他事项需要考虑。对于 IIS,“两者”是推荐的设置。主要是为了避免 Apartment 线程组件的锁定问题、对 COM+ ObjectContext 的高性能访问以及“免费”线程组件使用系统安全上下文的事实(如果您需要访问用户的安全上下文)。参见 Selecting a Threading Model for Components in IIS有关 IIS 线程注意事项的更多信息。

其他需要考虑的事项是 COM+ 支持以及组件在 COM+ 中运行时的行为方式以及是否传递和存储接口(interface)指针。

一篇优秀的文章是COM Threading and Application Architecture in COM+ Applications .它以 COM+ 为重点,但也讨论了 COM。对于您的问题,请阅读标题为“线程模型建议”的部分。 Microsoft 已删除原始文章,因此我链接到一个副本。

关于windows - 为什么我要使用 "Both"COM 线程模型而不是 "Free"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1824397/

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