题
我学习C#3.5,我想知道我们的计划做什么[STAThread]
?
解决方案
在STAThreadAttribute
基本上为Windows消息泵与COM组件进行通信的要求。虽然核心Windows窗体不使用COM,如系统对话框操作系统的许多组件确实使用这种技术。
MSDN 解释了略微的原因更详细地:
请将STAThreadAttribute指示 对于COM线程模型 应用程序是单线程 公寓。此属性必须 目前对任何入口点 应用程序,使用Windows窗体; 如果它被省略,在Windows 组件可能无法正常工作。 如果属性不存在,则 应用程序使用多线程 公寓的模式,这是不 支持Windows窗体。
本博客文章(为什么需要STAThread?的),也说明需求相当不错。如果你想有一个更深入的视图的线程模型的工作原理在CLR水平,看的此MSDN杂志从2004年6月一文(存档,2009年4月)。
其他提示
它告诉你在单线程单元模型是编译器。这是一个邪恶的COM的东西,它通常用于Windows窗体(GUI的)作为使用的Win32为其绘制,这是为STA实现。如果你正在使用的东西,是从多个线程STA模型,然后你会得到损坏的对象。
这就是为什么你必须从另一个线程调用到GUI(如果你做任何形式的编码)。
基本上不用担心,只是接受这是STA否则怪异的事情发生的Windows GUI线程必须标注。
请将STAThreadAttribute标志着一个螺纹 使用单线程COM 如果需要COM公寓。通过 默认情况下,.NET不会初始化COM在 所有。这是唯一需要COM时, 就像当一个COM对象或COM控制 创建或当拖动“n”个降 需要时,该COM被初始化。什么时候 出现这种情况,.NET调用 底层的CoInitializeEx功能, 这需要一个标志指示是否 加入线程多线程 或单线程单元。
更多信息此处(存档,2009年6月)
和