[STAThread]做什么?

时间:2009-09-01 07:29:37

标签: c# .net-attributes

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

3 个答案:

答案 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月)

Why is STAThread required?