为什么的WinForms应用程序在默认情况下STAThread?(Why are WinForms

2019-06-23 19:17发布

当你用Visual Studio创建一个空的WinForms应用程序,模板有STAThread在主应用程序类属性。

我一直在阅读一些文档这件事,但我不知道如果我的理解它。

真的,我有一些关于它的问题:

  1. 为什么这个属性添加?
  2. 这是什么意思?
  3. 如果您删除这个属性会发生什么?

Answer 1:

1.为什么这个属性添加?

因为它是由ActiveX对象模型所需。 你可以在一个WinForm下降ActiveX控件(所以它是有兼容性)或者一些.NET类使用的要求属性本地控制。

2.是什么意思?

这意味着在该线程运行单线程单元模型 。

3.如果您删除这个属性会发生什么?

如果属性被删除,该行为是不确定的。 该程序可能会失败随机的,与合理的有时错误消息。 举例来说,事情可能现在的工作,然后用服务包打破。



Answer 2:

若要从引用的MSDN博客 ,

当施加请将STAThreadAttribute,它改变了当前线程的单元状态为单螺纹。 没有进入有关COM和线程一个巨大的讨论,这个属性确保当前线程,并可能希望通过COM谈谈它的其他线程之间的通信机制。 当你使用的是Windows形式,这取决于您使用的功能,它可能是为了与操作系统组件通信使用COM互操作。 就是很好的例子是剪贴板和文件对话框。



Answer 3:

如果去掉这个属性3.什么情况?

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

我创建了简单的WinForms应用程序有一个按钮和一个OpenFileDialog。 在按钮点击我运行一个线程,其显示打开文件对话框。 我启动应用程序使用和不使用STAThread,点击按钮的结果都是一样的 - 它会抛出异常“跨线程操作无效:控制‘Form1的’从比它创建的线程以外的线程访问”。 这看起来好像没有什么区别。 但不是。

然后,我改变表示通过调用下面的方法中的打开文件对话框:

private void ShowOFD()
{
    if (InvokeRequired)
    {
        BeginInvoke(new Action(ShowOFD));
        return;
    }

    openFileDialog1.ShowDialog(this);
}

随着STAThread它按预期正常工作。 如果没有STAThread它抛出的异常:“当前线程必须设置为单线程单元(STA)模式下可以进行OLE调用前,请确保您的主要功能有请将STAThreadAttribute上标注此异常只是提出如果一个调试器附加到。过程”。

然后,我启动应用程序了几次都没有调试器(从Visual Studio分离)。 有一次,只是默默地关闭了应用程序,其他时间的应用程序封闭“vshost已停止工作”的消息



Answer 4:

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



文章来源: Why are WinForms applications STAThread by default?