我写了一个实现com连接点的示例com服务器。我在这个COM对象中调用一个方法,然后使用连接点机制在我的客户端代码中调用其他方法。
但以上列出的所有操作都是同步通信。我想让COM服务器是纯异步的,这样如果我的COM服务器得到一些事件,它应该将数据发送回它的客户端。
请建议如何使用COM连接点。
注意: - 我的COM服务器作为proc的proc运行。
提前致谢!!!
此致 阿希什
答案 0 :(得分:3)
线程是永远 COM中的一个小细节,就像它在任何运行时环境中一样。您必须观察COM客户端程序选择的公寓状态。如果它是STA,是迄今为止最常见的选择,那么您有责任在客户端代码选择的线程上触发事件。忽略该要求只会导致无法诊断客户端程序中的错误。
因此,如果您在自己的代码中从工作线程触发事件,这是让事件处理程序运行异步的唯一方法,那么必须封送接口指针。 CoMarshalThreadInterfaceInStream()或更易于使用的IGlobalInterfaceTable可以完成该工作。坚如磐石的要求。当客户端程序在调用CoInitializeEx()时使用COINIT_MULTITHREADED选择加入时,它将异步运行。您唯一能做的就是通过选择ThreadingModel注册表值,使用" Both"来发布您的代码是线程安全的这一事实。或者"免费"。
答案 1 :(得分:1)
与没有COM的情况相同:
回到COM,默认情况下COM中的所有方法调用都是同步的。当您在客户端提供的接收器接口上触发事件时,该调用将阻塞,直到客户端返回。这种行为有一个例外:IAdviseSink
。如果被调用者与调用者位于不同的COM公寓中,则此接口的方法是异步的。但是,IAdviseSink
可能不是您正在寻找的内容。
答案 2 :(得分:1)
使用asynchronous COM的标准方法要求接口具有用于异步接口的单独UUID。 IConnectionPoint
没有异步UUID,因此您无法使用ICallFactory
来实现异步COM。