我正在学习C#3.5,我想知道[STAThread]
在我们的课程中做了什么?
答案 0 :(得分:224)
STAThreadAttribute
基本上是Windows消息泵与COM组件通信的要求。虽然核心Windows窗体不使用COM,但操作系统的许多组件(如系统对话框)都使用此技术。
MSDN稍微详细解释了原因:
STAThreadAttribute表示 COM线程模型 应用程序是单线程的 公寓。该属性必须是 出现在任何入口点 使用Windows窗体的应用程序; 如果省略,则为Windows 组件可能无法正常工作。 如果该属性不存在,则 应用程序使用多线程 公寓模型,不是 支持Windows窗体。
This blog post(为什么需要STAThread?)也很好地解释了这个要求。如果您想更深入地了解线程模型在CLR级别的工作方式,请参阅this MSDN Magazine article from June 2004(Archived,2009年4月)。
答案 1 :(得分:30)
它告诉编译器您处于单线程单元模型中。这是一个邪恶的COM事物,它通常用于Windows窗体(GUI),因为它使用Win32作为其绘图,它实现为STA。如果您使用来自多个线程的STA模型,那么您将获得损坏的对象。
这就是你必须从另一个线程调用Gui的原因(如果你已经完成了任何表格编码)。
基本上不用担心,只要接受Windows GUI线程必须标记为STA,否则会发生奇怪的事情。
答案 2 :(得分:29)
STAThreadAttribute标记一个线程 使用单线程COM 公寓如果需要COM。通过 默认情况下,.NET不会初始化COM 所有。只有在需要COM的时候 比如COM对象或COM控件 已创建或拖放'n'时 需要,COM已初始化。什么时候 发生这种情况,.NET称之为 底层的CoInitializeEx函数, 它带有一个指示是否的标志 将线程加入多线程 或单线程公寓。
阅读更多信息here(已存档,2009年6月)
和