你能解释一下STA和MTA在你自己的词?

此外,什么是公寓的线和做他们只涉及COM?如果是这样,为什么?

有帮助吗?

解决方案

COM线程模型称为“公寓”。 model,其中初始化COM对象的执行上下文与单个线程(单线程单元)或多个线程(多线程单元)相关联。在这个模型中,COM对象一旦在公寓中初始化,就会在运行期间成为该公寓的一部分。

STA模型用于非线程安全的COM对象。这意味着他们不会处理自己的同步。这个的常见用途是UI组件。因此,如果另一个线程需要与对象交互(例如按下表单中的按钮),则将消息编组到STA线程上。窗体形成消息泵系统就是一个例子。

如果COM对象可以处理自己的同步,则可以使用MTA模型,允许多个线程与对象进行交互而无需编组调用。

其他提示

这是所有下来怎么电话的对象是处理,以及有多少保护他们的需要。COM对象可以要求运行时,以保护他们对被称为过多的线在同一时间;那些不可能会被称为同时从不同的线,所以他们来保护自己的数据。

此外,它还需要运行时,以防止COM目呼吁从阻止用户接口,如果一个电话是从用户界线。

一个 公寓 是一个地方为对象的生活,并包含一个或多个线程。公寓的定义时,会发生什么电话。呼吁的对象,在一间公寓将会被接收并处理任何线在那个公寓,例外的是,一个电话线已经在正确的公寓处理由本身(即直接打电话的对象)。

线可以是在一个单一的程的公寓(在这种情况下,他们的唯一线在那个公寓),或在多线程的公寓。他们指定当线初始化COM该线。

STA主要是为了兼容的用户界面,这是与特定的线。STA接收通知的电话进程,通过收到消息窗口到一个隐藏的窗口;当它使得一个出呼吁,它开始一个模式的消息循环,以防止其他消息窗口正在处理中。你可以指定一个信息过滤器,以便应用程序可以应对其他消息。

相比之下所有MTA线共享一个MTA的过程。COM可以开始新的工作线程,以处理传入的话,如果没有线提供,直到游泳池的限制。线作出的呼吁只是块。

为简单起见,我们将只考虑的对象,实现在Dll,其广告中注册他们的支持,通过设置 ThreadingModel 值为他们的类的关键。有四个选项:

  • 主螺纹(ThreadingModel 值不存在)。目的是创建在主持人主UI线程,以及所有的电话都汇集到这线。这类工厂只会呼吁该线。
  • Apartment.这表明此类可以运行上的任何单线式的螺纹。如果该线创建也是一个STA线,目将运行在线程,否则它将建立在主STA-如果没有主要STA存在,STA线会被创建。(这意味着MTA线,创造的公寓的对象将是调动所有的呼吁不同的线。) 这类工厂可以称为同时由多个STA线,因此它必须保护其内部数据免受这一点。
  • Free.这表明一个类设计的运行在MTA。它总是会载在MTA,即使创建一个STA线,这再次意味着STA线的电话将汇集.这是因为一个 Free 对象是一般的编写,希望它可以块。
  • Both.这些课程是灵活的,并载在公寓无论他们创建的。他们必须编写以适应这两套要求,但是:他们必须保护他们的内部国对并行的话,情况下,他们在装载在MTA,但必须不块,情况下,他们在装载在一个STA。

从.净框架,基本上仅仅使用 [STAThread] 在任何线创建的用户界面。工作人员的线应用的MTA,除非他们会使用 Apartment-标记COM组件,在这种情况下使用STA避免调动的开销,并可扩展性问题,如果相同的成分被称为从多个线程(因为每个线程将必须等待分反过来).它是更容易的所有周围如果你使用一个单独的COM对象每线,组件是否是在STA或MTA。

我发现现有的解释太gobbledygook了。这是我用简单的英语解释的:

STA: 如果一个线程创建了一个设置为STA的COM对象(当调用CoCreateXXX时,你可以传递一个将COM对象设置为STA模式的标志),那么只有这个线程可以访问这个COM对象(这就是STA的意思 - 单线程公寓),试图在这个COM对象上调用方法的其他线程默默地转向将消息传递给创建(拥有)COM对象的线程。这非常类似于只有创建UI控件的线程才能直接访问它。此机制旨在防止复杂的锁定/解锁操作。

MTA: 如果一个线程创建了一个设置为MTA的COM对象,那么几乎每个线程都可以直接调用它上面的方法。

这几乎是它的要点。虽然从技术上讲,我没有提到一些细节,例如在'STA'段落中,创建者线程本身必须是STA。但是,了解STA / MTA / NA几乎需要了解这一点。

STA(Single Threaded Apartment)基本上是一个概念,一次只有一个线程与您的代码交互。通过Windows消息(使用不可见的)窗口对您公寓的呼叫进行封送。这允许呼叫排队等待操作完成。

MTA(多线程公寓)是许多线程可以同时运行的地方,作为开发人员处理线程安全的责任在你身上。

要了解COM中的线程模型还有很多东西,但是如果你无法理解它们是什么,那么我会说理解STA是什么以及它是如何工作的将是最好的起点,因为大多数COM对象是STA’ s。

Apartment Threads,如果一个线程与它正在使用的对象位于同一个公寓中,那么它就是一个公寓线程。我认为这只是一个COM概念,因为它只是一种谈论与它们交互的对象和线程的方式…

每个承载COM或OLE控件的EXE都会定义它的公寓状态。公寓状态默认为STA(并且对于大多数程序应该是STA)。

STA - 所有OLE控件必须必须存在于STA中。 STA意味着必须始终在UI线程上操作COM对象,并且不能将其传递给其他线程(非常类似于MFC中的任何UI元素)。但是,您的程序仍然可以有很多线程。

MTA - 您可以在程序中的任何线程上操作COM对象。

据我所知,'Apartment'用于保护COM对象免受多线程问题的影响。

如果COM对象不是线程安全的,则应将其声明为STA对象。然后只有创建它的线程才能访问它。创建线程应该将自己声明为STA线程。在引擎盖下,线程将STA信息存储在其TLS(线程本地存储)中。我们将此行为称为线程进入STA公寓。当其他线程想要访问此COM对象时,它应该封送对创建线程的访问。基本上,创建线程使用消息机制来处理入站调用。

如果COM对象是线程安全的,则应将其声明为MTA对象。可以通过多线程访问MTA对象。

调用COM对象dll的代码(例如,读取专有数据文件)可能在用户界面中正常工作,但在服务中神秘地挂起。原因是.Net 2.0用户界面假设STA(线程安全),而服务假定MTA(在此之前,服务假设STA)。必须为服务中的每个COM调用创建STA线程可能会增加显着的开销。

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