类暴露事件,如何知道是否有人订阅了它

本文关键字:是否 事件 暴露 何知道 | 更新日期: 2023-09-27 18:16:27

我的类实现了接口,并且我向外界公开了事件。
我有一个轮询计时器,使用该事件发送数据到订阅者使用自定义eventArgs。
我想只在有人订阅事件时启动轮询计时器,并在每个人都取消订阅时停止计时器。
当有人订阅/取消订阅我的事件时,我如何检测?

如果没有人听,我可以自动启动/停止轮询定时器

类暴露事件,如何知道是否有人订阅了它

您可以添加自己的add/remove方法;例如:

private EventHandler someEvent;
public event EventHandler SomeEvent {
    add {
        someEvent += value;
        if(someEvent != null) EnsureTimerRunning();
    }
    remove {
        someEvent -= value;
        if(someEvent == null) StopTimerIfRunning();
    }
}

请注意,字段事件(即public event EventHandler SomeEvent;)包括编译器在add/remove周围生成的线程安全-您需要决定是否复制它,如果是:如何(lock, Interlocked,或者只是推迟到私有的支持字段事件,让编译器担心它)。一个非常简单的方法可能是:

private EventHandler someEvent;
private readonly object syncLock = new object();
public event EventHandler SomeEvent {
    add {
        lock(syncLock) {
            someEvent += value;
            if(someEvent != null) EnsureTimerRunning();
        }
    }
    remove {
        lock(syncLock) {
            someEvent -= value;
            if(someEvent == null) StopTimerIfRunning();
        }
    }
}