做什么?

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

STAThreadAttribute实质上是Windows消息泵与COM组件进行通信的一个要求。 虽然核心Windows窗体不使用COM,但系统对话框等许多操作系统组件都使用这种技术。

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

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

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

如果需要COM,则STAThreadAttribute将标记线程以使用单线程COM公寓。 默认情况下,.NET将不会初始化COM。 只有当需要COM时,比如创buildCOM对象或COM控件时,或者需要拖放'n'时,COM才会被初始化。 当发生这种情况时,.NET会调用底层的CoInitializeEx函数,该函数需要一个指示是否将线程joinmultithreading或单线程单元的标志。

阅读更多信息(存档,2009年6月)

为什么要求STAThread?

它告诉编译器你在一个单线程模型中。 这是一个邪恶的COM事物,它通常用于Windows窗体(gui's),因为它使用Win32作为其实现为STA的绘图。 如果你从多个线程使用STA模型,那么你会得到损坏的对象。

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

基本上不用担心,只是接受windows gui theads必须标记为STA,否则奇怪的事情发生。