多线程公寓的目的是什么?
What's the purpose of multi-threaded apartments?
我理解 STA 背后的原因,但不明白 MTA 背后的原因。
COM 对象可以在没有任何单元的情况下加载,对吗?这意味着它已经能够异步接听电话,因为没有人施加任何限制。
我哪里错了?
首先,您的假设是错误的:COM 对象不能在任何公寓外创建。通常,如果一个线程之前调用了 CoInitialize 或 CoInitializeEx,则它应该只创建 COM 对象,这将它放置在一个单元中。否则,创建通常会失败。存在隐式多线程单元的边缘情况(如果同一进程的另一个线程初始化它),但即使那样你也会在 MTA 中,只是以一种不可靠且难以调试的方式。不在公寓里就没有 COM 对象。
您想要 MTA 的原因是它不一定是唯一的公寓。一个进程可以有一个 MTA 和任意多个 STA。 MTA 和任何 STA 之间的呼叫仍然需要编组;否则,其中一个 MTA 线程可能会以不安全的方式调用 STA 线程。
事实上,至少有一个 STA 是规则而不是例外:用户界面希望存在于 STA 中,因为它依赖于按顺序处理的消息(例如,由于鼠标点击等) .
我理解 STA 背后的原因,但不明白 MTA 背后的原因。
COM 对象可以在没有任何单元的情况下加载,对吗?这意味着它已经能够异步接听电话,因为没有人施加任何限制。
我哪里错了?
首先,您的假设是错误的:COM 对象不能在任何公寓外创建。通常,如果一个线程之前调用了 CoInitialize 或 CoInitializeEx,则它应该只创建 COM 对象,这将它放置在一个单元中。否则,创建通常会失败。存在隐式多线程单元的边缘情况(如果同一进程的另一个线程初始化它),但即使那样你也会在 MTA 中,只是以一种不可靠且难以调试的方式。不在公寓里就没有 COM 对象。
您想要 MTA 的原因是它不一定是唯一的公寓。一个进程可以有一个 MTA 和任意多个 STA。 MTA 和任何 STA 之间的呼叫仍然需要编组;否则,其中一个 MTA 线程可能会以不安全的方式调用 STA 线程。
事实上,至少有一个 STA 是规则而不是例外:用户界面希望存在于 STA 中,因为它依赖于按顺序处理的消息(例如,由于鼠标点击等) .