2

我的班级实现了接口,我将事件暴露给外界。
我有一个轮询计时器,它使用该事件使用自定义 eventArgs 向订阅者发送数据。
我只想在有人订阅事件时启动轮询计时器,并在每个人都取消订阅时停止计时器。
如何检测某人何时订阅/取消订阅我的活动?

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

4

1 回答 1

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;的线程安全性- 您需要决定是否复制它,如果是的话:如何 ( , ,或者只是遵循私有的支持字段类似事件和让编译器担心)。一个非常简单的方法可能是:addremovelockInterlocked

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();
        }
    }
}
于 2013-06-03T08:31:19.587 回答