COM 是不是提供延迟关闭直到所有 RPC 完成的方法?

Posted

技术标签:

【中文标题】COM 是不是提供延迟关闭直到所有 RPC 完成的方法?【英文标题】:Does COM provide methods to delay shutdown until all RPCs are done?COM 是否提供延迟关闭直到所有 RPC 完成的方法? 【发布时间】:2017-01-30 16:04:38 【问题描述】:

我有两个进程:一个客户端和一个服务器。客户端发出一个呼叫,服务器开始处理,但服务器可以在呼叫完成之前开始关闭。这可能会导致调用所需的对象突然被破坏,从而导致崩溃。

客户端和服务器通过 COM 进行通信。在这种情况下,告诉给定服务器进程当前活跃的 RPC 数量的信息将非常有用。

作为这两个进程之间的通信层,COM 是否可以在它们进行主动交互时提供任何帮助来延迟关闭?

【问题讨论】:

这是一个无意义的问题,服务器只允许在最后一次 Release() 调用它发出的最后一个接口指针后关闭。忽略这个要求,或者引用计数错误,当然会炸毁客户端代码。它在 ATL 中是自动的,如果您自己执行,请查看 CoAddRefServerProcess() 的文档。 客户端通过代理与服务器对话,代理是一个 COM 对象。此代理引用服务器进程中的对象,这些对象不是 COM 对象,只是简单的 C++ 类。这些 C++ 类可以从不同线程上的代理中销毁和引用。我想先阻止客户端和服务器之间的进一步通信,然后等到正在进行的通信完成,然后执行关闭。 【参考方案1】:

我不知道您使用哪种语言来实现您的 COM 客户端/服务器。

但据我了解,您似乎面临 COM 多线程问题。您的 COM 服务器的线程模型是什么? (我想它是多线程的)

如果是这种情况,你应该同步你的线程。

最终的方法是将 COM 服务器的线程模型转换为单线程模型。在这种情况下,服务器关闭调用将在之前的客户端调用完成后执行。

【讨论】:

【参考方案2】: 我怀疑你真的想在 C++ 对象的构造函数中使用 CoAddRefServerProcess(以及在析构函数中使用 CoReleaseServerProcess)。 这将使您的服务器保持活动状态,直到 C++ 对象消失。 但是,这不会阻止客户端请求新实例,因此您可能还需要: CoRevokeClassObject 防止客户端的新实例获取代理。 如果您感觉真的很讨厌,CoDisconnectObject 将强制断开代理与服务器的连接。 *

【讨论】:

以上是关于COM 是不是提供延迟关闭直到所有 RPC 完成的方法?的主要内容,如果未能解决你的问题,请参考以下文章

延迟显示页面,直到所有内容都加载完毕

CLGeocoder 延迟直到完成处理程序

延迟 jquery 脚本,直到其他所有内容都已加载

阻止 Spring Boot 应用程序关闭,直到所有当前请求都完成

RxSwift:延迟 observable 直到另一个 observable 完成?

延迟弹出对话框片段,直到其中的 webview 完成加载