单螺纹公寓vs多线程公寓

时间:2009-01-27 20:27:41

标签: c# .net multithreading apartments

  

可能重复:
  Could you explain STA and MTA?

  

所有ThreadPool线程都在   多线程公寓。

- 根据MSDN

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

谢谢, 安东尼D

更新1

找到了这个 Could you explain STA and MTA?

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

更新2

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

5 个答案:

答案 0 :(得分:53)

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

答案 1 :(得分:12)

实际上,STA和MTA对.NET代码有影响。请参阅Chris Brumme的博客文章,了解更多细节,然后您可能需要:

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

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

答案 2 :(得分:9)

如果您的COM对象需要相信它在单线程环境中,请使用STA。您可以保证创建和所有调用都将由同一个线程完成。您可以安全地使用Thread本地存储,而不需要使用关键部分。

如果许多线程可以同时访问您的COM对象,请使用MTA - 不会有防护措施。

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

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