作者:有风吹过best | 2023-09-04 15:15
来自有关STAThread的MSDN文章:
表示应用程序的COM线程模型是单线程单元(STA).
(作为参考,这是整篇文章.)
单线程公寓......好吧,我的头脑.另外,我在某处读到,除非你的应用程序使用COM互操作,否则这个属性实际上什么都不做.那究竟它究竟做了什么,以及它如何影响多线程应用程序?多线程应用程序(包括使用Timer
s到异步方法调用的任何人,而不仅仅是线程池等)都应该使用MTAThread,即使它"只是为了安全"?STAThread和MTAThread实际上做了什么?
1> Bruce..:
公寓穿线是COM的概念; 如果您没有使用COM,并且您调用的API都没有"使用COM",那么您无需担心公寓.
如果您确实需要了解公寓,那么细节可能会有点复杂 ; 一个可能过于简单的版本是标记为STA的COM对象必须在STAThread上运行,标记为MTA的COM对象必须在MTA线程上运行.使用这些规则,COM可以优化这些不同对象之间的调用,从而避免在不必要的地方进行编组.
从STA线程上的STA对象到MTA对象的调用将编组到MTA线程(除非MTA对象实现了自由线程编组程序).就像我说的,细节可能变得复杂.(我在COM团队工作了很多年*咧嘴笑*)
有时即使您没有直接使用COM,也需要注意这一点.如果线程显示任何图形窗口,则必须使用单线程单元模型.这就是为什么[STAThread]始终显示在Windows窗体应用程序中的main方法之上的原因.
这太简单了.多线程对象可以在任何线程中运行.公寓螺纹对象只能在他们创建的公寓中运行.
在你不知道的情况下,不能像字体或文件对话框那样使用COM吗?我认为他们在内部做,这是否意味着几乎所有Windows窗体应用程序都需要设置STAThread?原谅我的naieve假设,因为我实际上没有完成COM编程.
对于那些感兴趣的人更详细的答案:http://stackoverflow.com/questions/4154429/apartmentstate-for-dummies
很抱歉复活旧的评论链,但@BrettRyan提出了一个非常有效的观点.我实际上找到了这个帖子,因为如果你在winforms中使用文件选择对话而不将Main()标记为STAThread,它将会死亡.我也可以(感谢上帝)确认它并没有影响我在我的程序中的几个背景工作者,大概是因为他们没有对我的知识进行任何COM调用.