首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么默认情况下WinForms应用程序是STAThread?

为什么默认情况下WinForms应用程序是STAThread?
EN

Stack Overflow用户
提问于 2011-01-11 23:25:08
回答 4查看 11.7K关注 0票数 20

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

我已经阅读了一些关于它的文档,但我不确定我是否完全理解它。

我真的有几个问题要问:

  1. 为什么添加此属性?
  2. 它是什么意思?
  3. 如果删除此属性会发生什么?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-11 23:27:02

  1. Why是此属性added?

因为它是ActiveX对象模型所必需的。您可以将ActiveX控件放在WinForm上(这样做是为了兼容),或者将一些使用本机控件的.NET类放在需要该属性的地方。

  1. What it it mean?

这意味着线程在single-threaded apartment model中运行。

如果删除此attribute?,则会发生

  1. What

如果删除该属性,则行为未定义。程序可能会随机失败,有时会出现合理的错误消息。例如,现在可以工作,然后使用service pack中断。

票数 15
EN

Stack Overflow用户

发布于 2008-09-19 14:49:52

引用an MSDN blog的话:

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

票数 21
EN

Stack Overflow用户

发布于 2016-01-09 07:45:07

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

我只是添加了一个简单的例子来演示这个问题。

我用一个按钮和一个OpenFileDialog创建了一个简单的WinForms应用。单击按钮后,我运行一个显示openFileDialog的线程。我使用和不使用STAThread启动应用程序,单击按钮的结果是相同的-它抛出异常“跨线程操作无效:控件'Form1‘从创建它的线程以外的线程访问”。看起来好像没有什么区别。但不是。

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

代码语言:javascript
复制
private void ShowOFD()
{
    if (InvokeRequired)
    {
        BeginInvoke(new Action(ShowOFD));
        return;
    }

    openFileDialog1.ShowDialog(this);
}

对于STAThread,它可以像预期的那样工作得很好。如果不使用STAThread,它将引发异常:“当前线程必须设置为单线程单元(STA)模式,然后才能进行OLE调用。请确保Main函数上标记了STAThreadAttribute。只有在将调试器附加到进程时才会引发此异常”。

然后,我在没有调试器的情况下多次启动应用程序(从visual studio分离)。一次应用程序静默关闭,另一次应用程序关闭并显示消息"vshost已停止工作“

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4659220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档