我的疑问是,在STA中,对同一接口中不同方法的调用是否会排队?或者对同一接口中同一方法的调用排队?
首先是过于简单化:
单线程单元 (STA) 是用于同步 COM 对象的构造,而不是方法。只要每个人都遵守规则,就可以保证该对象一次只能被一个客户端访问,即一次只能调用一个方法。当您处于不同的调用过程中时,同一对象中的方法(当然我的意思是“同一实例”,而不是“同一类”)不会被不同的线程随机调用。
如果您需要提供更细粒度的同步,例如只需要同步一个方法体,那么公寓并不是适合您的机制。最灵活的方法是使您的对象成为自由线程,并在需要时手动编写自己的同步代码。当然这是更多的工作。
现在,我需要更精确,因为我们都只是挥手示意了很多非常重要的细节:
单线程公寓的真正目标是为对象提供线程亲和力。 COM 对象的代码只能在创建该对象的线程中运行,而不能在其他线程中运行。如果不同的线程需要与您的对象通信,它们必须等待,直到拥有您的对象的线程可用。事实上,在很多情况下,这意味着方法调用要排队,这是其自然的副作用。
“很多场景?”
是的。因为公寓不能防止重入。您的方法 A() 可以在同一对象上调用另一个方法 B()。 B()可以回调A()。或者,当您仍在执行 A() 的过程中,A() 可以调用 object2->MethodX() ,它本身会调用您自己的方法 D() 。或者 A() 可以触发事件(请参阅连接点),并且事件处理程序可以在对象上调用不同的方法 E()。因此,将 COM 公寓称为对象的同步机制有点简单化,如果您不考虑细节,可能会给您带来麻烦。
当然,互斥体和其他同步原语也是线程绑定的,因此它们具有相同的重入警告。但使用含糊的语言可能会让你认为公寓做了他们不做的事情。认为在 STA 对象中一次只能激活一个方法是一种危险的心理模型。
线程亲和性是单线程公寓的一个关键目标,因为 COM 被设计为多线程世界中 OLE(可以将电子表格的一系列单元格拖到 Microsoft Word 文档中的东西)的现代基础。 OLE 对象很大程度上依赖于图形系统资源来绘制图像,并且这些资源是线程仿射的。
对于那些在钦奈寻找新家的人来说,红山的待售公寓很快引起了人们的关注。该区域提供多种选择,从经济实惠的 2BHK 单位到宽敞的 3BHK 单位,可满足各种偏好和财务计划。这些[红山待售公寓]采用现代设计、高品质建筑和一系列现代设施,增强整体生活体验。该地区与主要道路、公共交通、学校和医疗设施的连接非常便利,使其成为家庭和投资者方便实用的选择。凭借其经济实惠、交通便利和现代生活的理想组合,红山正在成为钦奈最理想的购房地点之一。