【发布时间】:2013-06-03 08:28:19
【问题描述】:
我的班级实现了接口,我将事件暴露给外界。
我有一个轮询计时器,它使用该事件使用自定义 eventArgs 向订阅者发送数据。
我想仅在有人订阅事件时启动轮询计时器,并在每个人都取消订阅时停止计时器。
如何检测某人何时订阅/取消订阅我的活动?
这样,如果没有人听,我可以自动启动/停止轮询计时器。
【问题讨论】:
我的班级实现了接口,我将事件暴露给外界。
我有一个轮询计时器,它使用该事件使用自定义 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();
}
}
}
【讨论】:
null 测试