取消方法调用
随着分布式和基于 Web 的应用程序的引入,某些方法调用可能需要很长时间才会返回。 网络连接的延迟可能会很高,服务器计算机可能为许多客户端提供服务,或者服务器组件可能会传递大量数据,例如多媒体文件。 用户应能够取消运行时间太长的请求,并且应用程序应能够处理取消请求并继续执行其他工作。 在 COM 中,可以使用 IMessageFilter 接口取消源自单线程单元的挂起调用。
封送调用后,代理将创建一个 cancel 对象,该对象将实现 ICancelMethodCalls 接口。 cancel 对象与调用挂起的调用和线程相关联。
若要取消挂起的调用,客户端可通过 cancel 对象传递取消请求,该请求将处理通知服务器对象已取消调用的详细信息。 如果调用的方法尚未返回,则服务器对象在检测取消请求时,通过返回相应的 HRESULT 值来清除已分配的任何程序资源并通知其客户端,从而取消调用执行。 如果调用的方法已返回,则 cancel 对象会通知客户端。 在任一情况下,客户端线程都会被解除阻止,可以继续处理。
服务器对象如何响应取消请求取决于服务器实现者,但客户端上的调用线程将始终被解除阻止,并将忽略服务器尝试传递给它的任何结果。 cancel 对象提供请求取消当前正在运行的方法的方式,但不能保证服务器对象将停止处理调用。 例如,调用可能已返回,或者服务器对象可能不支持 cancel 对象。
COM 自动为使用标准封送的客户端对象和接口提供 cancel 对象的标准实现。 对于使用自定义封送的对象和接口,需要实现自己的 cancel 对象。
此时,cancel 对象仅处理同步调用。
相关主题