根据 这篇文章 如果注册我COM的对象,无论是"两"或"免费"的螺纹型的,对象必须是完全线的安全。具体而言所有访问的全球共同变量必须同步和所有访问成员变量也必须是同步的。这是一个很大的努力。

现在我明白了,能够登记我的对象使用"免费"的螺纹型是有利的,可能是值得付出的代价使得它完全线的安全。但是为什么我要做所有的相同和登记我的对象使用"两个"线程模型,而不是?会是什么好处?我怎么选择之间的"双方"和"免费"?

有帮助吗?

解决方案

这两个线程模型

主要原因标记你的成分作为支持螺纹型的"两个"是为了改进性能组件时正从一个单一的螺纹套公寓(STA)。

如果你标记你的成分作为MTA和你的分量是创建在一个STA然后你的组成部分将是创建一个独立的MTA公寓 "所得到的间公寓封送可能会降低性能足以否定所有的工作投入使一个有效的、免费的程的组件".然而,如果您的组件的螺纹型的标记为"两个"然后,它将创建公寓内的STA目和直接访问。

所以如果你认为你的成分可以被称为从内STA(所有维生素b6COM对象是STA)你可能会想到的标记线程模型为"两个".

一个很好的KB上的文章 OLE线程模型.

免费线程模型

你可能希望使用的"免费"的螺纹型的如果你的成分使用的其他组件,标记为"免费"。如果您的组件被标记为"两个"然后有可能是过度的公寓交换之间的"两个"组成部分运行的STA和MTA。作为一般规则,试图创建的组件作为附近的呼叫者作为可能的(即相同的公寓),而正常工作在所有情况。

另一种情况,这将保证标记你的成分作为"免费"是的,如果它明确地块(例如螺纹。睡眠).如果组件被标记为"两者"并实例在STA然后该部分将块STA消息泵。

其他考虑和方案

如果你都计划使用的组件在IIS,然后还有其他的事情要考虑。For IIS,"Both"是所建议的设置。主要是为了避免锁定问题的公寓螺纹件,性能访问COM+体而事实上,"自由"螺纹件使用该系统的安全方面(如果您需要获得用户的安全上下文)。看看 选择一个线程模型的部件在IIS 更多的信息,关于IIS线的考虑因素。

其他要考虑的事情都COM+支持和如何组件的行为,如果他们运行在COM+和是否接口指针的传递和储存。

一个很好的文章是 COM线程和程序的架构中COM+应用程序.它有一个COM+焦点,但还讨论了COM.对于您的问题,阅读部分题为"螺纹型的建议"。微软已经删除的原始文所以我联系到一个副本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top