[STAThread]做什么?

odi*_*seh 277 c# .net-attributes

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

Nol*_*rin 232

STAThreadAttribute基本上是Windows消息泵与COM组件通信的要求.虽然核心Windows窗体不使用COM,但操作系统的许多组件(如系统对话框)都使用此技术.

MSDN稍微详细解释了原因:

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

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

  • /sf/ask/290810061/ 这个答案对于像我这样的凡人来说是可以理解的。添加在这里仅供参考 (2认同)

Spe*_*nce 33

它告诉编译器您处于单线程单元模型中.这是一个邪恶的COM事物,它通常用于Windows窗体(GUI),因为它使用Win32作为其绘图,实现为STA.如果您使用来自多个线程的STA模型,那么您将获得损坏的对象.

这就是你必须从另一个线程调用Gui的原因(如果你已经完成了任何表格编码).

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

  • 实际上,它只涉及处理操作系统对话框和第三方组件等COM组件. (3认同)
  • Win32没有提供线程公寓的概念,其COM引入了这个概念.COM"重新任务"完全与线程无关的系统(Windows消息泵)作为在COM公寓中同步/序列化代码执行的手段. (3认同)
  • STAThread与访问GUI时调用主线程的要求无关.这仅仅是由于Windows消息泵的性质,并且在多线程应用程序中无法更普遍地避免. (2认同)
  • 只需接受 Windows GUI 头必须标记为 STA,否则会发生奇怪的事情。:)))))) (2认同)

rah*_*hul 29

如果需要COM,STAThreadAttribute标记一个线程使用单线程COM公寓.默认情况下,.NET根本不会初始化COM.只有当需要COM时,例如创建COM对象或COM控件或需要拖放'n'时,才初始化COM.当发生这种情况时,.NET会调用底层的CoInitializeEx函数,该函数会获取一个标志,指示是否将线程连接到多线程或单线程单元.

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

为什么需要STAThread?