Com 在单线程单元模型中,对方法的任何调用都是同步的吗?

Com 在单线程单元模型中,对方法的任何调用都是同步的吗?,com,apartments,Com,Apartments,我的疑问是,在STA中,对同一接口中不同方法的调用是否排队?或者在同一接口中对同一方法的调用已排队?首先,过于简化: 单线程单元(STA)是用于同步COM对象的构造,而不是方法。只要每个人都遵守规则,就可以保证对象一次只能被一个客户机访问,也就是说,一次只能调用一个方法。在同一个对象中没有方法(当然,我的意思是“同一个实例”,而不是同一个类的方法)将在不同的调用中间由一个不同的线程随机调用。 例如,如果您需要提供更细粒度的同步,则只需要同步一个方法体,那么单元不是适合您的机制。最灵活的方法是使对

我的疑问是,在STA中,对同一接口中不同方法的调用是否排队?或者在同一接口中对同一方法的调用已排队?

首先,过于简化:

单线程单元(STA)是用于同步COM对象的构造,而不是方法。只要每个人都遵守规则,就可以保证对象一次只能被一个客户机访问,也就是说,一次只能调用一个方法。在同一个对象中没有方法(当然,我的意思是“同一个实例”,而不是同一个类的方法)将在不同的调用中间由一个不同的线程随机调用。 例如,如果您需要提供更细粒度的同步,则只需要同步一个方法体,那么单元不是适合您的机制。最灵活的方法是使对象自由线程化,并在需要时手动编写自己的同步代码。当然,这是更多的工作

现在,我需要更准确地说,因为我们都只是在手上挥舞着很多非常重要的细节:

单线程单元的真正目标是为对象提供线程关联性。COM对象的代码只能在创建该对象的线程中运行,而不能在其他线程中运行。如果另一个线程需要与您的对象对话,则必须等待拥有您的对象的线程可用。事实上,在很多情况下,这意味着方法调用是排队的,这是一个自然的副作用

“很多场景?”

对。因为公寓不能阻止再次进入。方法A()可以对同一对象调用另一个方法B()。B()可以回调A()。或(a)可以调用Objuts2->方法x(),它本身仍然在执行()的过程中调用自己的方法D.()。或者()可以触发事件(请参见连接点),事件处理程序可以对对象调用不同的方法E()。因此,将COM单元称为对象的同步机制有点简化,如果不考虑细节,可能会给您带来麻烦

当然,互斥体和其他同步原语也是线程绑定的,因此它们具有相同的重入警告。但通过使用模糊的语言,你可能会认为公寓做了一些他们不做的事情。认为在STA对象中一次只能激活一种方法是一种危险的心理模型


线程亲和性是单线程公寓的一个关键目标,因为COM被设计成OLE(在一个多线程世界中可以将电子表格单元格拖动到一个微软Word文档中的东西)的现代基础。OLE对象在很大程度上依赖图形系统资源来绘制其图像,而这些资源是线程仿射的。

首先,过于简化:

单线程单元(STA)是用于同步COM对象的构造,而不是方法。只要每个人都遵守规则,就可以保证对象一次只能被一个客户机访问,也就是说,一次只能调用一个方法。在同一个对象中没有方法(当然,我的意思是“同一个实例”,而不是同一个类的方法)将在不同的调用中间由一个不同的线程随机调用。 例如,如果您需要提供更细粒度的同步,则只需要同步一个方法体,那么单元不是适合您的机制。最灵活的方法是使对象自由线程化,并在需要时手动编写自己的同步代码。当然,这是更多的工作

现在,我需要更准确地说,因为我们都只是在手上挥舞着很多非常重要的细节:

单线程单元的真正目标是为对象提供线程关联性。COM对象的代码只能在创建该对象的线程中运行,而不能在其他线程中运行。如果另一个线程需要与您的对象对话,则必须等待拥有您的对象的线程可用。事实上,在很多情况下,这意味着方法调用是排队的,这是一个自然的副作用

“很多场景?”

对。因为公寓不能阻止再次进入。方法A()可以对同一对象调用另一个方法B()。B()可以回调A()。或(a)可以调用Objuts2->方法x(),它本身仍然在执行()的过程中调用自己的方法D.()。或者()可以触发事件(请参见连接点),事件处理程序可以对对象调用不同的方法E()。因此,将COM单元称为对象的同步机制有点简化,如果不考虑细节,可能会给您带来麻烦

当然,互斥体和其他同步原语也是线程绑定的,因此它们具有相同的重入警告。但通过使用模糊的语言,你可能会认为公寓做了一些他们不做的事情。认为在STA对象中一次只能激活一种方法是一种危险的心理模型


线程亲和性是单线程公寓的一个关键目标,因为COM被设计成OLE(在一个多线程世界中可以将电子表格单元格拖动到一个微软Word文档中的东西)的现代基础。OLE对象在很大程度上依赖图形系统资源来绘制其图像,并且这些资源是线程仿射的。

如果您指的是来自另一个单元的调用,那么是-跨单元调用到STA被实现为窗口消息,并在消息队列中排队。有关详细信息,请参见仅当需要从不同的apartmentsNo调用方法时才对调用进行排队(使用windows消息)。具体的方法无关紧要,封送处理规则同样适用于所有方法。如何获得接口指针才是最重要的。同步范围是我吗