繁体   English   中英

[STAThread] 是做什么的?

[英]What does [STAThread] do?

我正在学习 C# 3.5,我想知道[STAThread]在我们的程序中做了什么?

STAThreadAttribute本质上是 Windows 消息泵与 COM 组件通信的要求。 尽管核心 Windows 窗体不使用 COM,但操作系统的许多组件(例如系统对话框)确实使用了此技术。

MSDN稍微详细地解释了原因:

STAThreadAttribute 表示应用程序的 COM 线程模型是单线程单元。 该属性必须存在于任何使用 Windows 窗体的应用程序的入口点; 如果省略,Windows 组件可能无法正常工作。 如果该属性不存在,则应用程序使用 Windows 窗体不支持的多线程单元模型。

这篇博文(为什么需要 STAThread? )也很好地解释了该要求。 如果您想更深入地了解线程模型如何在 CLR 级别工作,请参阅这篇 MSDN 杂志 2004 年 6 月的文章(存档,2009 年 4 月)。

它告诉编译器您处于单线程单元模型中。 这是一个邪恶的 COM 东西,它通常用于 Windows 窗体 (GUI),因为它使用 Win32 为其绘图COM 拖放 COM 组件(感谢@AnthonyWJones),它作为 STA 实现。 如果您使用的是来自多个线程的 STA 模型,那么您会得到损坏的对象。

这就是为什么您必须从另一个线程调用 Gui(如果您已完成任何表单编码)。

基本上不用担心,只需接受必须将 Windows GUI 线程标记为 STA,否则会发生奇怪的事情。

如果需要 COM,STAThreadAttribute 标记一个线程使用单线程 COM 单元。 默认情况下,.NET 根本不会初始化 COM。 只有当需要 COM 时,例如创建 COM 对象或 COM 控件时,或者需要拖放时,COM 才会被初始化。 当发生这种情况时,.NET 调用底层的 CoInitializeEx 函数,该函数采用一个标志来指示是将线程加入多线程单元还是单线程单元。

在此处阅读更多信息(2009 年 6 月存档)

为什么需要 STAThread?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM