为什么WPF需要将STAThread属性应用于Main方法?

时间:2009-08-18 11:58:02

标签: wpf sta

我是WPF的新手,在我阅读的每个教程中,他们都有[System.STAThread]属性应用于他们的Main方法,或者他们告诉读者这样做。

这个属性真的“必需”吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:32)

这是一个Windows要求而不是WPF要求,并且从.NET之前回到Windows窗体和控件的原始设计。

STAThread是指“Single-Threaded Apartments”,它指的是当前(主要)线程使用的线程模型。使用中的线程模型决定了其他.NET和COM应用程序如何与您的应用程序(以及其本身的线程)进行通信。单线程应用程序模型要求一次没有单个对象“存在”多个STA线程,这与MTA线程模型相反;并允许仅通过编组作为对象将指针传递到公寓之间的数据。

基本上,通过[STAThread]声明,其他应用程序将在发送数据时知道您的线程策略是什么。 STA模型是Windows线程/应用程序最常用的线程模型;但是,如果从STA建模的线程调用,您有时会遇到某些代码无法运行,因为它的设计是以不符合STA限制的方式跨线程边界发送/接收数据。事先知道给定线程的公寓模型允许IDE在编译时捕获这些异常,而不是在运行时尝试跨线程边界使用对象时出现令人讨厌的访问冲突错误。

您可以在MSDN文章中阅读有关STA和MTA主题的文章:http://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx

请注意,即使是普通的.NET应用程序(从WPF之前)也需要main()顶部的[STAThread]声明。

答案 1 :(得分:4)

blog entry中有一个很好的答案。

引自博客:

  

当STAThreadAttribute是   应用,它改变了公寓   当前线程的状态   单线程。没有进入   关于COM和COM的大讨论   线程,这个属性确保了   之间的沟通机制   当前线程和其他线程   可能想通过COM与它交谈。什么时候   您正在使用Windows窗体,具体取决于   关于你正在使用的功能,它可能是   使用COM互操作以便   与操作系统通信   组件。这方面很好的例子   剪贴板和文件对话框。

     

其中不支持Windows窗体   MTA或免费线程公寓。   使用Windows窗体的应用程序   应该总是宣布公寓   他们正在使用的风格,如同其他一些风格   组件可以初始化   公寓状态不正确。