【问题标题】:Single-Threaded Apartments vs Multi-Threaded Apartments [duplicate]单线程单元与多线程单元[重复]
【发布时间】:2010-10-03 20:39:06
【问题描述】:

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

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

--根据 MSDN

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

谢谢, 安东尼D

更新 1

找到这个 Could you explain STA and MTA?

谁能说得更详细些?

更新 2

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

【问题讨论】:

  • 好问题。我同意,那里没有很多直接/清晰的解释!

标签: c# .net multithreading apartments


【解决方案1】:

实际上,STA 和 MTA 会对 .NET 代码产生影响。请参阅 Chris Brumme 的博客文章,了解您可能需要的更多详细信息:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 完美,感谢您的精彩回答。我想所有这些只是为了弄清楚在这种情况下我不需要担心。
    • 不用担心。如果您使用的是 .Net COM 互操作,那么您大部分时间都不必考虑它。
    • 小修正,你可以有多个STA,但只有一个MTA。
    • 噢!很好发现 - 现已修复...
    • 仅供参考,MTA 是 .NET 线程的默认设置。
    【解决方案3】:

    正如其他人所指出的,它通常对 .NET 应用程序影响不大。

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我认为 Robert C. Barth 的回答也适用于这里,对吧? “除非你在做 COM 互操作,否则你不必担心它,在这种情况下会出现编组问题。它对 .net 本身没有任何影响。”
      • 有几个 .Net 特定点。最重要的是 WinForms 或 WPF 应用程序必须在 STA 中有它们的主线程。这是因为许多 UI 功能都是围绕 COM 实现的控件进行的瘦 .Net 包装器。因此 .Net 应用程序中 Main 方法上的 [STAThreadAttribute]。
      【解决方案5】:

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

      【讨论】:

      • 您不必担心,除非您尝试使用 WebBrowser 控件从 Web 服务发送 HTML 打印作业。 (每个人都说这样做的“简单”方式。)然后没有任何效果。
      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 2011-04-12
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多