C# 何时使用[MTAThread]?

C# 何时使用[MTAThread]?,c#,.net,multithreading,C#,.net,Multithreading,可能重复: 在C#windows窗体应用程序中。 我在Program.cs的主函数上面看到了[STAThread] 所以我想知道何时使用STA或MTA线程? 如何影响应用程序?您不能在WinForms中使用MTA,因为大多数windows控件都无法工作,因为它们与MTA不兼容。因此,除非应用程序的代码调用STA COM对象,否则始终使用MTA。例如,在ASP.NET中,MTA是默认模型。创建任何窗口的线程应始终创建单线程单元。STA为任何非线程安全的COM对象提供线程保证。很少有人这样做。CO

可能重复:

在C#windows窗体应用程序中。 我在Program.cs的主函数上面看到了[STAThread]

所以我想知道何时使用STA或MTA线程?

如何影响应用程序?

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

创建任何窗口的线程应始终创建单线程单元。STA为任何非线程安全的COM对象提供线程保证。很少有人这样做。COM基础设施确保始终从正确的线程调用此类对象的方法,并在必要时封送调用。与Control.Begin/Invoke()非常类似,但无需任何编码即可自动完成

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