进行和处理异步调用
COM 对象可以支持异步调用。 当客户端进行异步调用时,控件会立即返回到客户端。 当服务器处理调用时,客户端可以自由执行其他工作。 当客户端在没有调用结果的情况下不再继续时,可以获取该调用的结果。
例如,请求大型或复杂记录集可能很耗时。 客户端可以通过异步调用请求记录集,然后执行其他工作。 当记录集可用时,客户端可以快速获取,而不会受到阻止。
客户端不会直接在服务器对象上进行异步调用。 而是获取一个调用对象,该对象在服务器对象上实现同步接口的异步版本。 调用对象上的异步接口名称为 AsyncInterfaceName。 例如,如果服务器对象实现名为 IMyInterface 的同步接口,则调用对象将实现名为 AsyncIMyInterface 的异步接口。
注意
异步支持不适用于 IDispatch 或继承 IDispatch 的接口。
支持异步调用的服务器对象实现 ICallFactory 接口。 此接口公开单个方法 CreateCall,该方法创建指定调用对象的实例。 客户端可以查询 ICallFactory 以确定对象是否支持异步调用。
对于同步接口上的每种方法,相应的异步接口实现两种方法。 这些方法将前缀 Begin_ 和 Finish_ 附加到同步方法的名称。 例如,如果名为 ISimpleStream 的接口具有 Read 方法,AsyncISimpleStream 接口将具有 Begin_Read 和 Finish_Read 方法。 若要开始异步调用,客户端将调用 Begin_ 方法。
实现服务器对象时,不必为对象实现的每个接口提供调用对象。 如果服务器对象实现 ICallFactory 接口并使用标准封送,则封送客户端始终可以获取代理调用对象,即使服务器端没有调用对象也如此。 此代理将 Begin_ 方法封送为同步调用,服务器将同步处理调用,客户端可以通过调用 Finish_ 方法获取 out 参数。
相反,如果客户端对服务器端有调用对象的接口进行封送同步调用,则服务器将始终异步处理调用。 此行为对客户端来说并不明显,因为客户端将收到相同的 out 参数,以及从同步方法收到的相同返回值。
无论哪种情况,客户端和服务器之间的交互都如同同步调用一样封送:同步代理和异步代理的输出不可区分,与相应的存根输出一样。 此行为极大地简化了客户端和服务器的编程模型。 如果服务器对象实现 ICallFactory,那么封送的客户端不必尝试创建客户端可能不可用的调用对象,调用对象将始终可用。
当客户端和服务器位于同一单元中时,服务器对象将处理客户端发出的调用。 如果调用对象不可用,客户端必须显式获取同步接口并进行同步调用。
有关详情,请参阅以下主题: