来自有关STAThread的MSDN文章:
表示应用程序的COM线程模型是单线程单元(STA)。
(作为参考,那是the entire article。)
单线程公寓......好吧,这超出了我的想象。另外,我在某处读到,除非你的应用程序使用COM互操作,否则这个属性实际上什么都不做。那究竟它究竟做了什么,以及它如何影响多线程应用程序?多线程应用程序(包括使用Timer
的任何人进行异步方法调用,而不仅仅是线程池等)都应该使用MTAThread,即使它“只是为了安全”? STAThread和MTAThread实际上做了什么?
答案 0 :(得分:59)
公寓线程是一个COM概念;如果您没有使用COM,并且您调用的API都没有“使用COM”,那么您无需担心公寓。
如果您确实需要了解公寓,那么详细信息可以a little complicated;一个可能过于简单的版本是标记为STA的COM对象必须在STAThread上运行,标记为MTA的COM对象必须在MTA线程上运行。使用这些规则,COM可以优化这些不同对象之间的调用,避免在不必要的地方进行编组。
答案 1 :(得分:3)
它的作用是确保调用CoInitialize
指定COINIT_APARTMENTTHREADED作为参数。如果您不使用任何COM组件或ActiveX控件,它将对您没有任何影响。如果你这样做,那将是至关重要的。
公寓线程的控件实际上是单线程的,对它们的调用只能在创建它们的公寓中处理。
来自MSDN的更多细节:
在单线程中创建的对象 公寓(STA)接收方法调用 只有他们公寓的线程,所以 呼叫被序列化并且仅到达 在消息队列边界(当时 Win32函数PeekMessage或 调用SendMessage)。
在一个COM线程上创建的对象 多线程公寓(MTA)必须 能够接收来自的方法调用 其他线程随时。你会 通常实现某种形式的 多线程中的并发控制 使用Win32的对象代码 同步原语如 关键部分,信号量或 互斥体有助于保护对象 数据。
配置为的对象时 在中性螺纹公寓里跑 (NTA)由一个线程调用 无论是STA还是MTA,该线程 转移到NTA。如果这个帖子 随后打电话给CoInitializeEx 呼叫失败并返回 RPC_E_CHANGED_MODE。
答案 2 :(得分:-15)
STAThread是在C#GUI项目的Main函数之前编写的。它什么都不做,只允许程序创建一个单独的线程。