STAThread和多线程(STAThread and multithreading)

2019-09-03 00:17发布

从STAThread MSDN文章:

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

(供参考,这是整篇文章 。)

单线程公寓...... OK,那去了我的头。 另外,我读的地方,除非你的应用程序使用COM互操作,这个属性实际上确实什么都没有。 那么究竟是什么做的,它是如何影响多线程应用程序? 应多线程应用程序(其中包括使用来自任何人的任何Timer s到异步方法调用,而不仅仅是线程池等)使用MTAThread,即使是“以防万一”? 什么是STAThread和MTAThread实际上呢?

Answer 1:

单元线程是一个COM概念; 如果你没有使用COM,并没有调用使用COM“在幕后”这些API,那么你就不需要担心的公寓。

如果您还需要了解的公寓,详细信息可以得到一点点复杂 ; 一个可能是,过于简单的说法是,标记为STA COM对象必须在一个STAThread运行,和COM对象标记MTA必须在MTA线程中运行。 利用这些规则,COM可以优化这些不同对象之间的调用,避免编组它是没有必要的。



Answer 2:

什么,做它,它保证了CoInitialize调用指定COINIT_APARTMENTTHREADED作为参数。 如果你不使用任何COM组件或ActiveX控件它会在所有你没有影响。 如果你这样做,然后它是一种至关重要的。

控件彼此独立的线程是有效的单线程,给他们打电话的只有在他们所创建的公寓进行处理。

从MSDN一些细节:

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

在多线程单元(MTA)一个COM线程创建的对象必须能够随时接收来自其他线程的方法调用。 你会使用Win32同步原语如临界区,信号量或互斥来帮助保护对象的数据通常实现某种形式的并发控制的多线程对象的代码。

当被配置成在中性螺纹公寓(NTA)运行一个目的是通过一个线程,是在任一个STA或MTA,该线程转移到NTA调用。 如果该线程随后调用的CoInitializeEx,调用失败并返回RPC_E_CHANGED_MODE。



Answer 3:

STAThread是C#GUI项目的主要功能之前写的。 它什么也不做,但允许该程序创建一个单独的线程。



文章来源: STAThread and multithreading