使用STA / MTA的型号

时间:2010-02-22 12:01:55

标签: windows com

我正在尝试创建COM组件,它将经常被excel应用程序调用(excel将在初始化时加载COM)而另一个进程(假设procA)也发送(具有高频率)Windows消息这个组件。目前我将COM作为STA实现,但是,我经历过当COM忙于处理来自procA的消息时,excel UI卡住了。

请帮我解决这个问题。我可以创建一个简单的窗口线程来处理来自procA的消息,同时保持COM作为STA模型吗?或者我是否需要将COM作为MTA模型,如果是这样,请解释如何处理它。

谢谢

1 个答案:

答案 0 :(得分:1)

移动到MTA要求您执行所有必要的锁定以保护组件的状态。 它将增加线程切换开销,因为Excel的UI在特定线程上运行,这将阻止 1 ,同时调用交叉线程到您的组件中。另一个过程已经产生了交叉流程开销,因此没有真正的变化。

您可以通过将组件模型标记为线程模型“中性”来避免Excel跨线程开销 - 它仍然可以在任何线程中使用,而不会被绑定到MTA中(即所有进程中的调用将是直接的) ,没有线程swicthes)。将其写为自由线程(仍需要所有锁定),但只需更改注册。

鉴于确保组件是线程安全的所有努力,您可能会发现除非对组件的多次调用可以真正并发运行,否则没有任何优势。如果您只是在每个方法的持续时间内锁定,那么您不会在STA中保存任何内容。更精细的锁定可能会带来优势,但是您需要对可能的并发性进行更详细的分析,然后进行分析以证明您已经能够实现它。查看Amdahl's Law将涵盖这些问题。


1 这非常简单......实际情况相当复杂。