来自有关STAThread的MSDN文章:

  

表示应用程序的COM线程模型是单线程单元(STA)。

(作为参考,那是整篇文章。)

单线程公寓......好吧,这超出了我的想象。另外,我在某处读到,除非你的应用程序使用COM互操作,否则这个属性实际上什么都不做。那究竟它究竟做了什么,以及它如何影响多线程应用程序?多线程应用程序(包括任何人使用 Timer s到异步方法调用,而不仅仅是线程池等)都应该使用MTAThread,即使它只是“为了安全”? STAThread和MTAThread实际上做了什么?

有帮助吗?

解决方案

公寓线程是一个COM概念;如果您没有使用COM,并且您调用的API都没有使用COM“封面”,那么您无需担心公寓。

如果您确实需要了解公寓,那么详细信息可以有点复杂;一个可能过于简单的版本是标记为STA的COM对象必须在STAThread上运行,标记为MTA的COM对象必须在MTA线程上运行。使用这些规则,COM可以优化这些不同对象之间的调用,避免在不必要的地方进行编组。

其他提示

这样做可确保调用 CoInitialize ,并指定COINIT_APARTMENTTHREADED作为参数。如果您不使用任何COM组件或ActiveX控件,它将对您没有任何影响。如果你这样做,那将是至关重要的。

公寓线程的控件实际上是单线程的,对它们的调用只能在创建它们的公寓中处理。

来自MSDN的更多细节:

  

在单线程中创建的对象   公寓(STA)接收方法调用   只有他们公寓的线程,所以   呼叫被序列化并且仅到达   在消息队列边界(当时   Win32函数PeekMessage或   调用SendMessage)。

     

在一个COM线程上创建的对象   多线程公寓(MTA)必须   能够接收来自的方法调用   其他线程随时。你会   通常实现某种形式的   多线程中的并发控制   使用Win32的对象代码   同步原语如   关键部分,信号量或   互斥体有助于保护对象   数据。

     

配置为的对象时   在中性螺纹公寓里跑   (NTA)由一个线程调用   无论是STA还是MTA,该线程   转移到NTA。如果这个帖子   随后打电话给CoInitializeEx   呼叫失败并返回   RPC_E_CHANGED_MODE。

STAThread是在C#GUI项目的Main函数之前编写的。它什么都不做,只允许程序创建一个单独的线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top