代码之家  ›  专栏  ›  技术社区  ›  Javed Akram

何时使用[MTAThread]?[副本]

  •  17
  • Javed Akram  · 技术社区  · 14 年前

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

    在C#windows窗体应用程序中。 我见过 [横螺纹] 在主功能上方的Program.cs中。

    所以我想知道何时使用STA或MTA线程?
    它如何影响应用程序?

    2 回复  |  直到 8 年前
        1
  •  18
  •   Hans Passant    14 年前

    创建任何窗口的线程应该 总是 创建单线程公寓。STA为任何非线程安全的COM对象提供线程保证。很少有。COM基础结构确保始终从正确的线程调用此类对象的方法,并在必要时封送调用。与Control.Begin/Invoke()非常相似,但在没有任何编码的情况下自动完成。

    许多Windows设备都依赖于这一保证。值得注意的是,没有剪贴板、拖放和shell对话框(如OpenFileDialog)将无法正常工作。还有很多ActiveX控件,WebBrowser是Winforms项目中常用的控件。使UI线程成为MTA线程会导致难以诊断的故障,死锁是常见的故障。或者当组件的.NET包装器重复检查它是在STA上创建的时出现快速异常。

        2
  •  7
  •   Darin Dimitrov    14 年前

    不能在WinForms中使用MTA,因为大多数windows控件都无法工作,因为它们与MTA不兼容。因此,除非应用程序的代码调用STA COM对象,否则请始终使用MTA。例如,在ASP.NET中,MTA是默认模型。