为什么 WPF 需要将 STAThread 属性应用于 Main 方法?
题
我是 WPF 新手,在我阅读的每个教程中,他们要么有 [System.STAThread]
属性应用于他们的 Main
方法,或者他们告诉读者这样做。
这个属性真的是“必需的”吗?如果是这样,为什么?
解决方案
这更多的是 Windows 的要求,而不是 WPF 的要求,并且可以追溯到 .NET 之前的 Windows 窗体和控件的原始设计。
STAThread 指“单线程公寓”,指当前(主)线程使用的线程模型。使用的线程模型决定了其他 .NET 和 COM 应用程序如何与您的应用程序(本质上是其线程)进行通信。与 MTA 线程模型不同,单线程应用程序模型要求单个对象不能同时“驻留在”多个 STA 线程中;并允许仅通过编组为对象在公寓之间传递指向数据的指针。
基本上,通过 [STAThread] 声明,其他应用程序在向您发送数据时就会知道您的线程的策略是什么。STA模型是Windows线程/应用程序最常见的线程模型;但有时您会遇到某些代码,如果从 STA 模型线程调用,这些代码将无法运行,因为它被设计为以不符合 STA 限制的方式跨线程边界发送/接收数据。预先了解给定线程的单元模型允许 IDE 在编译时捕获这些异常,而不是在运行时尝试跨线程边界使用对象时出现令人讨厌的访问冲突错误。
您可以从 MSDN 文章中阅读有关 STA 和 MTA 线程的信息: http://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx
请注意,即使是普通的 .NET 应用程序(WPF 之前的版本)也需要在 main() 之上声明 [STAThread]。
其他提示
有在这博客条目这个出色答卷
从博客引用:
当请将STAThreadAttribute是 应用,它改变了公寓 当前线程的状态是 单线程的。没有进入 关于COM一个巨大的讨论, 穿线,该属性确保了 之间的通信机制 当前线程和其它线程 可能要通过COM谈论它。什么时候 您正在使用Windows窗体,这取决于 您所使用的功能,它可能是 使用COM互操作,以 与操作系统进行通信 组件。就是很好的例子是 剪贴板和文件对话框。
Windows窗体不支持内 一个MTA或自由线程公寓。 使用Windows窗体应用程序 应始终声明公寓 风格他们使用,其他一些 组件可以初始化 螺纹不当的单元状态。