通过附加/分离事件来控制事件触发频率。 不好的做法?

昨天我提供了一个问题的答案如何控制C#中的事件触发? 简而言之,请问以下内容:

“每当从相机收到一个新画面时都会发生一个事件。然而,这种情况比我想要的更频繁……我怎样才能控制事件发生的时间?”

在我的回答中,我提供了下面的代码,今天早上我发现我有2个downvotes没有任何评论。 我担心的主要不是代表的丢失,而是这是我在各种应用程序中使用自己的逻辑,并且downvotes可能表明我的实现是糟糕的实践或不利于性能。 因此,我问这个问题是为了澄清以这种方式附加/分离事件控制器是否有任何问题?

public MyObject() { MyTimer = new System.Timers.Timer(100); // 10 Hz MyTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); MyTimer.Enabled = true; } private void ImageDataUpdated(object sender, EventArgs e) { // detach from the event to keep it from firing until the timer event has fired. MyImageObject.Update -= new UpdateEventHandler(ImageDataUpdated); // do stuff } private static void OnTimedEvent(object source, ElapsedEventArgs e) { // (re-)attach to the event handler. MyImageObject.Update += new UpdateEventHandler(ImageDataUpdated); } 

此外,我写了以下内容,指的是在实际准备要发送给订阅者的数据之前,可以检查您是否有任何订阅者。 在某些情况下,这可能会导致CPU使用率降低。 对我来说似乎是正确的(我自己也这样做了),但这句话有什么不对吗?

使用此策略很可能在分离事件处理程序时阻止底层图像对象执行其他工作(当然这取决于图像对象的实现)。 您可能正在为自己的图像处理节省CPU周期。

我想他们认为基于不相关的计时器动态添加和删除事件是一件坏事。 虽然这是一个可能在某个地方有用的巧妙技巧,但总有一天 ,我倾向于同意它们。 对其他对象的事件处理程序的外部控制并不表示良好的封装。

另一种方法是简单地检查调用之间接收事件处理程序中是否已经过了足够的时间并决定是否处理。 这与逻辑在实时游戏或类似应用程序中的工作方式更为一致,这意味着您不会经常从外部连接和断开事件处理程序。

实际事件调用本身的开销非常小,所以不要担心每帧几次调用,只要每次都不执行“慢速部分”(即执行实际工作的位)。