[STAThread]是做什么的?


Answers:


240

STAThreadAttribute是Windows消息泵与COM组件进行通信的基本要求。尽管核心Windows窗体不使用COM,但是OS的许多组件(例如系统对话框)仍使用此技术。

MSDN更详细地解释了原因:

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

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


1
知道为什么CompactFramework不支持[STAThread]吗?
bvdb

1
stackoverflow.com/questions/4154429/apartmentstate-for-Dummies这个答案对于像我这样的凡人来说是可以理解的。新增仅供参考这里
巴里斯Akkurt

41

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

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

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


2
STAThread与访问GUI时调用主线程的要求无关。这仅仅是由于Windows消息泵的性质,在多线程应用程序中无法避免。
Noldorin

3
实际上,这仅与处理COM组件(例如OS对话框和第三方组件)有关。
Noldorin

3
Win32没有任何线程单元的概念,它的COM引入了这一概念。COM“重新分配任务”是一个完全线程不可知的系统(Windows消息泵),作为在COM公寓中同步/序列化代码执行的一种手段。
AnthonyWJones

1
只是接受Windows gui theads必须标记为STA否则会发生奇怪的事情。:))))))
Nipuna 2011年

1
@Noldorin“调用主线程的要求 ”-从技术上讲这不是必需的。跨线程异常不会在调试器之外发生。参考:stackoverflow.com/questions/3972727/…。并不是说您不应该解决这个问题!
2014年

31

如果需要COM,则STAThreadAttribute会将线程标记为使用单线程COM公寓。默认情况下,.NET根本不会初始化COM。仅当需要COM时(例如创建COM对象或COM Control或需要拖放'n'时),COM才会初始化。发生这种情况时,.NET会调用基础CoInitializeEx函数,该函数带有一个标志,该标志指示是将线程加入多线程单元还是单线程单元。

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

为什么需要STAThread?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.