【发布时间】:2020-08-28 20:02:03
【问题描述】:
我是 WPF 新手,在我阅读的每个教程中,他们要么将 [System.STAThread] 属性应用于他们的 Main 方法,要么告诉读者这样做。
这个属性真的是“必需的”吗?如果是,为什么?
【问题讨论】:
我是 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]。
【讨论】:
blog entry 中有一个很好的答案。
引自博客:
当
STAThreadAttribute是 应用,它改变了公寓 当前线程的状态为 单线程。无需进入 关于 COM 和 线程,此属性确保 之间的沟通机制 当前线程和其他线程 可能想通过 COM 与它交谈。什么时候 您正在使用 Windows 窗体,具体取决于 在您使用的功能上,它可能是 使用 COM 互操作以 与操作系统通信 成分。很好的例子是 剪贴板和文件对话框。不支持 Windows 窗体 MTA 或免费螺纹公寓。 使用 Windows 窗体的应用程序 应始终申报公寓 他们使用的风格,和其他一些风格一样 组件可以初始化 线程的单元状态不正确。
【讨论】: