使用回调方法的异步通知

使用回调方法实现异步处理分为两部分工作。第一部分是部件的设计人员的工作。设计人员应该:

  1. 定义要执行的任务或通知。

  2. 提供一个或多个可在外部创建的类来管理任务或通知。管理器类也可以做具体的处理工作,或者另提供一个工作类来做实际的工作。

  3. 创建一个类型库,其中包含客户端为接收通知而必须实现的接口(或一组接口)。该接口必须包括部件用来通知客户端的所有方法。

注意 要用 Visual Basic 创建类型库,请参阅“部件设计的一般准则”中的“使用 Visual Basic 创建标准接口”。

  1. 管理器类应提供由客户端调用的方法,用于初始化任务或者要求通知。

注意 所有这些方法必须有一个参数声明为第 3 步中的接口类型,以便客户端可以选择自己要用的回调实现方案。

  1. 编写代码,启动任务进程或监视感兴趣事件的进程。

  2. 编写代码,在完成任务或者观察到感兴趣事件时调用相应的回调方法。

提示 如果客户端提供大量的异步服务,应将功能相近的回调组成一个独立的接口。这是因为不管客户端类是否使用一个接口中的所有方法,都必须实现接口的每一种方法。如果一个接口包含很多的回调方法,客户端使用起来就很不方便。

  1. 第二部分是使用这个部件的开发者的工作。开发者应该:
    1. 创建一个公共类,用来实现部件设计人员定义的接口。

注意 这个类的 Instancing 属性应设为 PublicNotCreatable。该类必须是公共的,以便部件可以调用其回调,但是不应让其它应用程序创建该类的实例。

  1. 在客户端要用到的回调中,编写处理该通知的代码。

提示 必须实现接口的所有方法,并且可以注释掉那些不使用的方法。

  1. 编写代码请求部件的管理器类实例。

  2. 编写代码,调用方法初始化任务或要求通知。

图 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 程序员指南》的“用对象编程”中的“多态性”。