如何通知事件订阅者

8
在我的上一次面试中,有人问我如何实现一个类,该类公开事件并在订阅该事件的新订阅者订阅该事件时立即通知他们。换句话说,一个类公开事件以通知订阅者数据源已更新;许多其他类可以随时订阅该事件。当一个类订阅事件时,它必须被通知以获取存储在数据源中的最新数据版本,但其他类不必被通知(它们已经是最新的)。
他们建议我重写addHandler方法,但我如何只通知新的订阅者呢?
.NET中是否有我不知道的功能,还是我需要在订阅处理程序时为订阅者类定义一个要调用的方法(一些观察者模式)?
编辑:我认为我没有表达清楚,所以我将尝试另一种方式来解释它。假设我有一个观察者模式。当一个新观察者订阅主题时,它会立即通过主题得到最新的数据源值更新。稍后,当数据源内部发生变化时,主题将像往常一样通知所有注册的观察者。我被问及如何使用.NET事件进行此操作。
1个回答

15

您的术语表述不够清晰 - 您所说的"必须激活"是什么意思?您是否指事件处理程序必须在订阅点调用一次?如果是这样,那听起来像是:

private EventHandler foo;

public event EventHandler Foo 
{
    add
    {
        if (value != null)
        {
            value(this, EventArgs.Empty);
        }
        foo += value;
    }

    remove
    {
        foo -= value;
    }
}

这真是一个相当奇怪的设计。

如果不是您所追求的,请尝试澄清。

有关更多信息,请参阅我的有关事件和委托的文章


有没有这样的情况,即订阅者添加到事件时,他们立即需要提供最新值。在这种情况下,这种模式难道不会有用吗? - crypted
在我看来,他们想知道如何仅通知最后一个事件订阅者,我建议在任何新订阅时引发事件,他们回复说这样我会通知所有订阅者(请原谅我的糟糕英语,我用“通知”替换了“激活”)。 - user260192
2
@Stefano:实际上不是这样的。这只会在存储在value中的新委托上引发它。我还要质疑这是否是良好的设计。我并不真正希望在分配结束之前就引发事件。最好让客户端在需要之前拉取新信息,然后开始监听事件。 - Euphoric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接