何时使用事件或回调通知

主题“使用回调的异步通知”和“使用事件的异步通知”演示表明回调所要实现的工作比事件多。但不应只是根椐工作量来决定使用哪一种方式。回调和事件代表不同的通讯方式,应选择最适合需要的。

可将事件和回调之间的差别特征化:事件象匿名广播,而回调象一次握手。

由此可知,引发事件的部件对其客户端一无所知,而进行回调的部件却知之甚详。

对于开发人员意味着:

注意 事件与回调的另一差别在于,事件不能具有可选参数、命名参数或 ParamArray 参数。

  1. 部件可用回调提供一些通知,也可用事件提供一些通知。通知的特点决定要使用什么方式。当下列所有命题为真时,应使用事件来提供通知:
    1. 可匿名广播通知。

    2. 客户端接收通知的次序不重要。

    3. 直到知道所有客户端接收到通知之前,部件都不必再获得控制。

    4. 如果通知涉及 ByRef 参数,且在每个客户端接收到通知之后,部件不必测试这些参数的值。部件只需知道最后一个指定值。(可安排客户端在使用 ByRef 参数时进行合作,例如,一旦将 Cancel 参数设置成 True,客户端就不能改变它;但无法硬性这样做。)

    5. 部件不必知道客户端中发生的错误。

如果上述命题中有一为假,则应做额外工作使用回调方法来提供通知

当执行任务性能极为关键时,也可使用回调方法来做额外工作。使用 Implements 命题将回调接口添加到客户程序的回调对象上,就可得到具有回调方法的 vtable 绑定。事件是不会被 vtable 绑定的。(对提供事件或回调的进程内部件,这点尤为显著。)