由于一些奇怪的原因,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委托只保存一个正确的事件处理程序。
答案 0 :(得分:3)
来自MSDN:
Elapsed事件在a上引发 ThreadPool线程。如果处理 经历的事件持续时间超过 间隔,可能会引发事件 再次在另一个ThreadPool线程上。 因此,事件处理程序应该是 折返。
答案 1 :(得分:0)
我最基本的本能就是不知何故你实际上有两个事件连接到Elapsed事件 - 导致两个事件被触发。我已经被抓住了,有时是因为我已经在设计器中添加了事件连线,但是在这里有一些继承方面,其中连线已经在基类中并且你正在重复它在派生类中。
当然,如果有多个线程,那么这是一个完全不同的球赛!
答案 2 :(得分:0)
编辑以考虑米奇所说的内容,因为我完全忘记了这是最简单的答案。在处理Elapsed事件的方法中,请确保您首先停止计时器,以便在处理事件时不会再次触发事件。