在C#windows窗体应用程序中。 我在Main函数上面的Program.cs中看到了 [STAThread] 。
所以我想知道何时使用STA或MTA线程?
它如何影响应用程序?
答案 0 :(得分:16)
创建任何窗口的线程应始终创建单线程单元。 STA为任何非线程安全的COM对象提供线程保证。很少是。 COM基础结构确保始终从正确的线程调用此类对象的方法,并在必要时对调用进行编组。与Control.Begin / Invoke()非常相似,但在没有任何编码的情况下自动完成。
许多Windows设施都依赖于这种保证。值得注意的是,没有它,Clipboard,Drag + Drop和shell对话框(如OpenFileDialog)将无法正常工作。还有很多ActiveX控件,WebBrowser是你在Winforms项目中常用的一个。使您的UI线程成为MTA线程导致难以诊断失败,死锁是常见的。或者当组件的.NET包装器仔细检查它是否在STA上创建时,快速异常。
答案 1 :(得分:6)
您不能在WinForms中使用MTA,因为大多数Windows控件都无法正常工作,因为它们与MTA不兼容。因此,除非应用程序的代码调用STA COM对象,否则请始终使用MTA。例如,在ASP.NET中,MTA是默认模型。