C# 为什么WinForms应用程序默认为线程?

C# 为什么WinForms应用程序默认为线程?,c#,.net,winforms,sta,C#,.net,Winforms,Sta,使用Visual Studio创建空的WinForms应用程序时,模板在主应用程序类中具有STAThread属性 我一直在读一些关于它的文档,但我不确定我是否理解它 我真的有一些问题: 为什么要添加此属性 这是什么意思 如果删除此属性会发生什么情况 引用 应用STAThreadAttribute时,它会将当前线程的单元状态更改为单线程。在不涉及COM和线程的大量讨论的情况下,该属性确保了当前线程与可能希望通过COM与之通信的其他线程之间的通信机制。当您使用Windows窗体时,根据您使用的功能,

使用Visual Studio创建空的WinForms应用程序时,模板在主应用程序类中具有
STAThread
属性

我一直在读一些关于它的文档,但我不确定我是否理解它

我真的有一些问题:

  • 为什么要添加此属性
  • 这是什么意思
  • 如果删除此属性会发生什么情况
  • 引用

    应用STAThreadAttribute时,它会将当前线程的单元状态更改为单线程。在不涉及COM和线程的大量讨论的情况下,该属性确保了当前线程与可能希望通过COM与之通信的其他线程之间的通信机制。当您使用Windows窗体时,根据您使用的功能,它可能使用COM互操作与操作系统组件通信。剪贴板和文件对话框就是很好的例子


    这意味着Windows窗体程序使用单线程单元状态。不支持MTA和自由线程单元状态

    一,。为什么要添加此属性

    因为它是ActiveX对象模型所必需的。您可以在WinForm上删除ActiveX控件(为了兼容性起见),或者某些.NET类使用需要该属性的本机控件

    二,。这是什么意思

    这意味着线程运行在

    三,。如果删除此属性会发生什么情况

    如果删除该属性,则行为未定义。程序可能会随机失败,有时会出现明显的错误消息。例如,现在事情可能正常,然后使用服务包中断

    3.如果删除此属性会发生什么情况

    我只是添加了一个简单的例子来说明这个问题

    我用一个按钮和一个OpenFileDialog创建了一个简单的WinForms应用程序。单击按钮,我运行一个显示openFileDialog的线程。我启动应用程序时使用和不使用StatThread,单击按钮的结果是相同的-它抛出异常“Cross thread operation not valid:Control'Form1'从创建它的线程以外的线程访问”。 看起来好像没有什么区别。但是没有

    然后,我通过调用以下方法更改了openFileDialog的显示:

    private void ShowOFD()
    {
        if (InvokeRequired)
        {
            BeginInvoke(new Action(ShowOFD));
            return;
        }
    
        openFileDialog1.ShowDialog(this);
    }
    
    使用StatThread,它可以正常工作。如果没有StatThread,则会引发异常: “在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。请确保主函数上标记了STAThreadAttribute。只有在将调试器附加到进程时才会引发此异常。”


    然后,我在没有调试器的情况下多次启动该应用程序(与VisualStudio分离)。有一次应用程序只是静静地关闭,另一次应用程序关闭时显示消息“vshost已停止工作”

    如果你在答案中添加博客链接,那就太好了。可能重复:@Cody:是的,对不起,我没有看到,但我知道这个答案比另一个好得多。是的,这是公平的。我没有投票结束,因为这些答案并不完美。从这个问题中收集到的最重要的知识是以下链接:注意->添加到vb.net应用程序Public Sub Main()您将遇到的最大问题是COM互操作。不要说你没有这样做,不要在意Windows在幕后做了很多事情。至少WPF甚至拒绝在MTA工作,并立即抛出一个异常。可能WinForms也能做到这一点。这不仅仅是ActiveX控件,还有很多其他东西都依赖于它。剪贴板,拖放,任何shell对话框,如OpenFileDialog。另外还有许多.NET包装器,它们在幕后使用COM API。这是您无法看到的所有COM互操作,但只能在STA线程中正常工作。即使CLR也知道,例如在UI线程上调用时,Thread.Join()也会泵送一个消息循环。