使用回调方法实现异步处理分为两部分工作。第一部分是部件的设计人员的工作。设计人员应该:
注意 要用 Visual Basic 创建类型库,请参阅“部件设计的一般准则”中的“使用 Visual Basic 创建标准接口”。
注意 所有这些方法必须有一个参数声明为第 3 步中的接口类型,以便客户端可以选择自己要用的回调实现方案。
提示 如果客户端提供大量的异步服务,应将功能相近的回调组成一个独立的接口。这是因为不管客户端类是否使用一个接口中的所有方法,都必须实现接口的每一种方法。如果一个接口包含很多的回调方法,客户端使用起来就很不方便。
注意 这个类的 Instancing 属性应设为 PublicNotCreatable。该类必须是公共的,以便部件可以调用其回调,但是不应让其它应用程序创建该类的实例。
提示 必须实现接口的所有方法,并且可以注释掉那些不使用的方法。
图 8.13 显示了设计人员和开发者是如何相互作用,为 CoffeeReady 示例提供了异步处理。CoffeeReady 示例来自“创建 ActiveX EXE 部件”中的循序渐进过程。
图 8.13 使用回调方法的异步通知
注意 图 8.13 中的号码代表在已结束的应用程序和部件中所发生的事件的顺序。它们和任务列表中的号码并不是对应的。
提示 如果 NotifyMe 对象只需要使用一次,那么客户端就不必保留其引用。在这种情况下,客户端调用 TellMeReady
的代码可以写为下面的形式:
Call mcof.TellMeReady(New NotifyMe)
让 Coffee 对象处理多个客户端的一种方法是为该部件在客户端与 Coffee 对象之间插入一个 Connection 对象。这样每个客户端就有一个自己的 Connection 对象,每个 Connection 对象能够为各自的客户端提供对共有的 Coffee 对象的引用。
Coffee 对象的 TellMeReady 方法需要将 ICoffeeNotify 引用放在一个集合中,以便计时器能够穷举该集合,并调用每个客户端的 CoffeeReady 方法。
详细信息 关于这些任务的执行方法,请参阅“创建 ActiveX EXE 部件”中的示例应用程序,其中演示了使用事件和回调方法的异步通知。接口的实现请参阅“部件设计的一般准则”中的“通过接口的实现提供多态性”。多态性请参阅《Visual Basic 程序员指南》的“用对象编程”中的“多态性”。