Windows 什么';多线程公寓的目的是什么?

Windows 什么';多线程公寓的目的是什么?,windows,com,Windows,Com,我理解STA背后的原因,但并不真正理解MTA的原因 COM对象可以在没有任何单元的情况下加载,对吗?这意味着它已经能够异步地接受调用,因为没有人设置任何约束 我错在哪里?首先,你的假设是错误的:COM对象不能在任何单元之外创建。通常,如果线程以前调用了CoInitialize或CoInitializeX(将其放置在单元中),那么它只应该创建COM对象。否则,创建通常会失败。隐式多线程单元(如果同一进程的另一个线程对其进行了初始化)存在边缘情况,但即使如此,您也会处于MTA中,只是以一种不可靠且难

我理解STA背后的原因,但并不真正理解MTA的原因

COM对象可以在没有任何单元的情况下加载,对吗?这意味着它已经能够异步地接受调用,因为没有人设置任何约束


我错在哪里?

首先,你的假设是错误的:COM对象不能在任何单元之外创建。通常,如果线程以前调用了CoInitialize或CoInitializeX(将其放置在单元中),那么它只应该创建COM对象。否则,创建通常会失败。隐式多线程单元(如果同一进程的另一个线程对其进行了初始化)存在边缘情况,但即使如此,您也会处于MTA中,只是以一种不可靠且难以调试的方式。任何COM对象都不存在于公寓中

你想要MTA的原因是它不一定是唯一的公寓。一个进程可以有一个MTA和任意多个STA。MTA和任何STA之间的呼叫仍需要封送;如果不是,其中一个MTA线程可能会以不安全的方式调用STA线程


事实上,至少有一个STA是规则,而不是例外:用户界面希望生活在STA中,因为它依赖于要按顺序处理的消息(例如,由于鼠标单击等)。

STA是一个历史COM功能(来自Windows的大量代码支持它,有时开发人员使用它会感到非常痛苦)这使多线程免费,而不需要开发人员做很多工作。MTA有点相反,也就是说,它是一个非功能。MTA=更快。除非您手动执行,否则任何内容都不会序列化。STA=如果您不想干扰同步,则它是一个免费功能。MTA本身并不比STA快。如果您在同一时间使用STA,则不会进行序列化阅读创建公寓的文章。认为MTA基本上什么都不做,这就是为什么我说它不是一个功能。真正的问题更多的是“STA的目的是什么”?COM公寓线程模型(single,apartment,两者)是20多年前创建的,所以最初是桌面单线程应用程序(如VB应用程序)将支持多线程(包括服务器应用程序),没有太多奇怪的bug。没有功能的东西仍然需要一个名称,以便您可以谈论它。