41

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

所有 ThreadPool 线程都在多线程单元中。

--根据 MSDN

这意味着什么?我真的很关心多线程与单线程单元模型之间的区别。或者公寓模型是什么意思?我已经阅读了关于它的 MSDN,这对我来说真的没有意义。我想我可能有一个想法,但我想这里有人可以用简单的英语解释它。

谢谢,安东尼 D

更新 1

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

任何人都可以更具描述性吗?

更新 2

我也在寻找有关这如何应用于线程池的答案,以及因此我需要注意的事项。

4

5 回答 5

56

STA(单线程单元)和 MTA(多线程单元)与COM有关。COM 组件可以设计为由单个线程访问,在这种情况下,它们托管在STA中,或者它们可以内部线程安全,并托管在MTA中。一个进程只能有一个 MTA,但可以有多个 STA。如果您只打算使用 COM 组件,那么您真正需要知道的是您必须将单元与组件匹配,否则会发生令人讨厌的事情。

于 2009-01-27T20:35:57.660 回答
12

实际上,STA 和 MTA 对 .NET 代码有影响。有关更多详细信息,请参阅 Chris Brumme 的博客条目,然后您可能需要:

https://devblogs.microsoft.com/cbrumme/apartments-and-pumping-in-the-clr/

了解 STA 如何在 .NET 中发送消息非常重要。它确实有后果。

于 2009-01-28T18:26:02.087 回答
9

如果您的 COM 对象需要相信它处于单线程环境中,请使用 STA。您可以保证创建和所有调用都将由同一个线程进行。您可以安全地使用 Thread 本地存储,而无需使用临界区。

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

于 2009-01-27T20:33:03.407 回答
5

正如其他人所指出的,它通常对 .NET 应用程序几乎没有影响。

但是,请注意,用于单元测试的 Microsoft 测试主机实际上是在 STA 中实现的,这意味着您可以在单元测试中执行的操作存在限制。例如,如果您使用的是 Microsoft 的测试主机,则您不能在单元测试中执行 a WaitAllon a 。WaitHandle

于 2009-01-27T20:45:42.290 回答
2

除非您正在执行 COM 互操作,否则您不必担心它,在这种情况下会出现编组问题。它对 .net 本身没有任何影响。

于 2009-01-27T20:32:16.187 回答