使用System.Timers.Timer时非常奇怪的错误

时间:2008-10-27 08:45:39

标签: .net events timer

由于一些奇怪的原因,Elapsed事件发射两次,它肯定会发射一次。 之后,计时器停止工作...... 代码结构有点像这样: 某个对象被定义为在某个事件包含的值时触发某个事件,该值在500-1500ms间隔内不断更新,与前一个值相比增加了超过X的总和。

例如,如果我将X定义为2,并且我收到的值例如是1,2,1,2,3,4,8,则在输入8时将触发事件。 该事件的事件处理程序启动上述计时器,该计时器在其过去之前运行Y时间并触发有问题的事件。 如果在计时器结束之前该值恢复正常,则重置计时器。

因此,整体结果应该是一个测量某个动态值的应用程序,并监视它在超过Y秒时间内发生的大型X大小异常。

代码中的总体结果类似于

vMonitor.Range=X;
vMonitor.Over+= new EventHandler(StartTimer);
vMonitor.Normal+= new EventHandler(StopTimer);
vTimer.Elapsed+= new EventHandler(RaiseAlert);
source.BeginUpdate(vMonitor.Value);

实际的问题是,在计时器结束时,RaiseAlert会被触发两次,然后就好像计时器完全停止工作,而不再完全触发。 我认为值得一提的是,完整的应用程序包含大量的线程活动,一次运行至少2个线程,更新vMonitor值。

有什么想法吗?

更新

关于线程问题,解释确切结构相当复杂,但我可以说vMonitor对象包含在另一个对象中,该对象包含更新值,该值由各种线程以受监视的方式不断更改, 当然。每当更新父对象的值时,将其与vMonitor进行比较,并触发正确的事件。随后,vMonitor中的值将替换为父对象值。

编辑:我刚刚再次验证了它,vTimer.Elapsed委托只保存一个正确的事件处理程序。

3 个答案:

答案 0 :(得分:3)

来自MSDN

  

Elapsed事件在a上引发   ThreadPool线程。如果处理   经历的事件持续时间超过   间隔,可能会引发事件   再次在另一个ThreadPool线程上。   因此,事件处理程序应该是   折返。

答案 1 :(得分:0)

我最基本的本能就是不知何故你实际上有两个事件连接到Elapsed事件 - 导致两个事件被触发。我已经被抓住了,有时是因为我已经在设计器中添加了事件连线,但是在这里有一些继承方面,其中连线已经在基类中并且你正在重复它在派生类中。

当然,如果有多个线程,那么这是一个完全不同的球赛!

答案 2 :(得分:0)

编辑以考虑米奇所说的内容,因为我完全忘记了这是最简单的答案。在处理Elapsed事件的方法中,请确保您首先停止计时器,以便在处理事件时不会再次触发事件。