我是 WPF 新手,在我阅读的每个教程中,他们要么将[System.STAThread]
属性应用于他们的Main
方法,要么告诉读者这样做。
这个属性真的是“必需的”吗?如果是这样,为什么?
这更像是 Windows 的要求,而不是 WPF 的要求,并且可以追溯到 .NET 之前的 Windows 窗体和控件的原始设计。
STAThread 指的是“单线程公寓”,指的是当前(主)线程使用的线程模型。使用的线程模型决定了其他 .NET 和 COM 应用程序如何与您的应用程序(以及固有的线程)进行通信。与 MTA 线程模型相比,单线程应用程序模型要求没有单个对象一次“存在”多个 STA 线程;并且只允许通过 marshalling-as-object 跨公寓传递指向数据的指针。
基本上,通过 [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 互操作来与操作系统组件进行通信。剪贴板和文件对话框就是很好的例子。MTA 或自由线程单元不支持 Windows 窗体。使用 Windows 窗体的应用程序应始终声明它们正在使用的单元样式,因为某些其他组件可能会不正确地初始化线程的单元状态。