class expos事件,如何知道是否有人订阅了它

时间:2013-06-03 08:28:19

标签: c# events

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

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

1 个答案:

答案 0 :(得分:6)

您可以添加自己的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周围编译器生成的线程安全性 - 您需要决定是否要复制它,如果是这样的话:如何(lockInterlocked,或者只是按照私有支持字段类事件并让编译器担心它。一种非常简单的方法可能是:

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();
        }
    }
}