类暴露事件,如何知道是否有人订阅了它
本文关键字:是否 事件 暴露 何知道 | 更新日期: 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();
}
}
}