我正在学习c# 3.5,我想知道[STAThread]在我们的程序中做什么?
STAThreadAttribute本质上是Windows消息泵与COM组件通信的一个要求。虽然核心Windows窗体不使用COM,但是操作系统的许多组件,如系统对话框,确实使用了这种技术。
MSDN更详细地解释了原因:
STAThreadAttribute表示 的COM线程模型 应用是单线程的 公寓。此属性必须为 出现在任何入口点 使用Windows窗体的应用程序; 如省略,则Windows 组件可能无法正常工作。 如果属性不存在,则 应用程序使用多线程 公寓模式,这不是 支持Windows窗体。
这篇博文(为什么需要STAThread ?)也很好地解释了这个需求。如果您想更深入地了解线程模型在CLR级别上是如何工作的,请参阅MSDN杂志2004年6月的这篇文章(Archived, 2009年4月)。
它告诉编译器您处于单线程公寓模型中。这是一个邪恶的COM东西,它通常用于Windows窗体(GUI),因为它使用Win32绘制COM来拖放COM组件(感谢@AnthonyWJones),它被实现为STA。如果你正在使用来自多线程的STA模型,那么你会得到损坏的对象。
这就是为什么你必须从另一个线程调用Gui(如果你已经做了任何表单编码)。
基本上不用担心,只要接受Windows GUI线程必须被标记为STA,否则就会发生奇怪的事情。
STAThreadAttribute标记一个线程 使用单线程COM 公寓如果需要COM。通过 默认情况下,.NET不会初始化COM 所有人。只有在需要COM的时候, 比如COM对象或COM控件 是创建的还是拖放的 需要时,COM被初始化。当 发生时,.NET调用 底层CoInitializeEx函数, 它需要一个标志来指示是否 将线程连接到多线程 或者单线程公寓。
点击这里阅读更多信息(2009年6月存档)
and
为什么需要STAThread ?
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?
- c#对象列表,我如何得到一个属性的和