单线程单元(STA)与多线程单元(MTA)

43

可能重复:
你能解释一下STA和MTA吗?

所有线程池线程都在多线程公寓中。

--根据MSDN所述

这是什么意思?我真的很关心多线程与单线程公寓模型之间的区别是什么。或者公寓模型是什么意思?我已经阅读了MSDN上的内容,但对我来说并不是很清楚。我认为我可能有一个想法,但我想在这里有人可以用简单的英语解释一下。

谢谢, 安东尼 D

更新1

找到了这个 你能解释一下STA和MTA吗?

有人能更详细地解释吗?

更新2

我还在寻找关于如何将其应用于线程池以及因此需要注意什么的答案。


1
很好的问题。我同意,确实没有太多直接/清晰的解释! - Noldorin
5个回答

57

STA(单线程公寓)和MTA(多线程公寓)与COM有关。 COM组件可以设计为仅由单个线程访问,在这种情况下,它们将托管在一个STA中,或者可以使其内部线程安全,并在一个MTA中托管。一个进程只能有一个MTA,但可以有多个STA。 如果您只是使用COM组件,则需要知道的真正信息只有:必须将公寓与组件匹配,否则会发生不良后果。


太好了,感谢您的精彩回答。我想我只是为了弄清楚在这种情况下不需要担心而已。 - Anthony D
1
没问题。如果你正在使用 .Net COM 互操作,那么大部分时间你都不需要考虑它。 - Stu Mackellar
小修正,你可以有多个STA,但只能有一个MTA。 - Jeremy
糟糕!发现了 - 现在已经修复了... - Stu Mackellar
1
FYI,MTA是.NET线程的默认设置。 - Teoman shipahi
@Teomanshipahi 一些 PowerShell 版本的默认值是 STA。 - brandon_busby

12

9

如果您的COM对象需要认为它在单线程环境中运行,请使用STA。这样可以保证创建和所有调用都由同一个线程进行。您可以安全地使用Thread local storage,而无需使用临界区。

如果您的COM对象可能被多个线程同时访问,请使用MTA,不会设置任何保护措施。


我认为Robert C. Barth的答案在这里也适用,对吧?“除非你正在进行COM-interop,否则你不必担心它,因为这会涉及到封送问题。这对于.NET本身没有任何影响。” - Anthony D
4
有几个与.NET相关的重点。最重要的是,WinForms或WPF应用程序必须在STA中拥有它们的主线程。这是因为很多UI功能是基于COM实现控件的轻薄.NET包装器。因此,在.NET应用程序的Main方法上有[STAThreadAttribute]。 - Stu Mackellar

6

正如其他人指出的那样,它通常对.NET应用程序影响很小。

然而,请注意,用于单元测试的Microsoft测试主机实际上是在STA中实现的,这意味着在单元测试中有一些限制。例如,如果你正在使用Microsoft的测试主机,则无法在单元测试中对WaitHandle执行WaitAll操作。


2

除非进行COM-Interop,否则您不必担心它,因为这会涉及到编组问题。这对于 .NET 本身没有任何影响。


直到你尝试使用WebBrowser控件从Web服务发送HTML打印作业时,你才需要担心。(这是每个人都说要做的“简单”方法。)然后什么都不起作用。 - Katastic Voyage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接