我了解STA背后的原因,但并没有真正了解MTA的原因。
COM对象可以不带任何单元地加载,对吗?这意味着它已经可以异步进行呼叫,因为没有人施加任何约束。
我在哪里错了?
答案 0 :(得分:1)
首先,您的假设是错误的,不能在任何公寓外部创建COM对象。通常,如果线程先前已调用CoInitializ或CoInitializeEx(将其放置在一个单元中),则仅应创建COM对象。否则创建通常会失败。隐式多线程单元有一个极端的情况(如果同一进程的另一个线程初始化了它),但是即使那样,您也将处于MTA中,只是一种不可靠且难以调试的方式。没有公寓就没有COM。
您想要MTA的原因是它不一定是唯一的公寓。一个进程可以有一个MTA,任意多个STA。 MTA与任何STA之间的调用仍然需要进行封送处理,如果不是,则其中一个MTA线程可能以不安全的方式调用STA线程。
实际上,至少有一个STA是规则,而不是例外:用户界面要生活在STA中,因为它取决于消息(例如,由于鼠标单击等)要顺序处理的消息。< / p>