你能用你自己的话解释一下STA和MTA吗?
另外,什么是公寓线程,它们只与COM有关吗?如果有,为什么?
你能用你自己的话解释一下STA和MTA吗?
另外,什么是公寓线程,它们只与COM有关吗?如果有,为什么?
当前回答
调用COM对象dll的代码(例如,读取私有数据文件)可能在用户界面中正常工作,但却神秘地挂在服务上。原因是。net 2.0的用户界面假设是STA(线程安全的),而服务假设是MTA((在此之前,服务假设是STA)。必须为服务中的每个COM调用创建一个STA线程会增加大量开销。
其他回答
每个承载COM或OLE控件的EXE都定义了它的单元状态。单元状态默认为STA(对于大多数程序应该是STA)。
STA -所有OLE控件必须位于STA中。STA意味着你的com对象必须总是在UI线程上操作,不能传递给其他线程(就像MFC中的任何UI元素一样)。但是,您的程序仍然可以有许多线程。
MTA -你可以在程序中的任何线程上操作COM对象。
STA(单线程公寓)的基本概念是,一次只有一个线程与您的代码交互。打到你公寓的电话是通过窗口消息(使用一个不可见的)窗口编组的。这允许调用排队等待操作完成。
MTA(多线程公寓)是许多线程可以同时操作的地方,作为开发人员的您有责任处理线程安全性。
关于COM中的线程模型还有很多需要学习的地方,但是如果你在理解它们是什么方面有困难,那么我会说理解STA是什么以及它是如何工作的将是最好的起点,因为大多数COM对象都是STA的。
公寓线程,如果一个线程和它正在使用的对象住在同一个公寓,那么它就是公寓线程。我认为这只是一个COM概念,因为它只是谈论与它们交互的对象和线程的一种方式……
我发现现有的解释太官样文章了。下面是我的解释:
STA: If a thread creates a COM object that's set to STA (when calling CoCreateXXX you can pass a flag that sets the COM object to STA mode), then only this thread can access this COM object (that's what STA means - Single Threaded Apartment), other thread trying to call methods on this COM object is under the hood silently turned into delivering messages to the thread that creates(owns) the COM object. This is very much like the fact that only the thread that created a UI control can access it directly. And this mechanism is meant to prevent complicated lock/unlock operations.
MTA: 如果一个线程创建了一个设置为MTA的COM对象,那么几乎每个线程都可以直接调用该对象上的方法。
这差不多就是要点了。虽然从技术上讲,还有一些细节我没有提到,比如在“STA”段落中,创造者线程本身必须是STA。但这几乎是你了解STA/MTA/NA所需要知道的全部内容。
COM线程模型称为“单元”模型,其中初始化的COM对象的执行上下文与单个线程(单线程单元)或多个线程(多线程单元)相关联。在这个模型中,COM对象一旦在一个单元中初始化,就在其运行期间是该单元的一部分。
STA模型用于非线程安全的COM对象。这意味着它们不处理自己的同步。它的一个常见用途是UI组件。因此,如果另一个线程需要与对象交互(例如按表单中的按钮),则消息将被编组到STA线程上。windows窗体消息泵送系统就是一个例子。
如果COM对象可以处理自己的同步,那么可以使用MTA模型,其中允许多个线程与对象交互,而不需要编组调用。
调用COM对象dll的代码(例如,读取私有数据文件)可能在用户界面中正常工作,但却神秘地挂在服务上。原因是。net 2.0的用户界面假设是STA(线程安全的),而服务假设是MTA((在此之前,服务假设是STA)。必须为服务中的每个COM调用创建一个STA线程会增加大量开销。