Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用System.Timers.Timer时出现非常奇怪的错误_.net_Events_Timer - Fatal编程技术网

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

.net 使用System.Timers.Timer时出现非常奇怪的错误,.net,events,timer,.net,Events,Timer,出于某种奇怪的原因,经过的事件会触发两次,而它肯定会触发一次。 紧接着,计时器停止工作。。。 代码结构有点像这样: 当某个对象所包含的值(以500-1500ms的间隔不断更新)比上一个值增加X和以上时,该对象被定义为触发某个事件 例如,如果我将X定义为2,并且我接收的值是1,2,1,2,3,4,8,例如,当输入8时,事件将触发。 该事件的事件处理程序启动前面提到的计时器,该计时器运行Y个时间,然后消失并触发有问题的事件。 如果该值在计时器过期之前恢复正常,则计时器将重置 因此,总体结果应该是一个

出于某种奇怪的原因,经过的事件会触发两次,而它肯定会触发一次。 紧接着,计时器停止工作。。。 代码结构有点像这样: 当某个对象所包含的值(以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会在计时器过期时触发两次,然后就好像计时器完全停止工作,不再触发一样。 我认为值得一提的是,完整的应用程序包含很多线程活动,一次至少运行两个线程,更新vMonitor值

有什么想法吗

更新: 关于线程问题,解释确切的结构是相当复杂的,但我可以说vMonitor对象包含在另一个对象中,其中包含更新值,当然,各个线程会以监视的方式不断更改更新值。无论何时更新父对象的值,都会将其与vMonitor进行比较,并触发适当的事件。VMMonitor中的值随后被父对象值替换


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

我最基本的直觉是,不知何故,您实际上有两个事件连接到Appeased事件-导致两个事件触发。我被这件事弄明白了,有时是因为我在设计器中已经添加了事件wireup时手动添加了事件wireup,或者这里有一些继承方面,其中wireup已经在基类中,而您正在派生类中重复它


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

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

来自:

已用事件在服务器上引发 线程池线程。如果处理 已过去的事件持续时间超过 间隔,则可能引发该事件 再次在另一个线程池线程上。 因此,事件处理程序应该是 可重入的