2011-03-31 100 views
1

嗨我已经创建了一个Windows服务,并且在那里有两个不同的计时器变量。第一个每5秒发射一次,然后做它需要做的事情。第二个每30秒发射一次。在同一代码中以不同的时间间隔触发两个不同的计时器变量问题

我确保当函数得到执行时,禁用两个定时器,并在函数完成后启用。

我的问题是我的第二个更长的时间(30秒)计时器从不会触发第一个射击。我在3个月前创建了这项服务,到现在为止工作情况良好。但是现在我没有看到定时器在我创建的一个简单的Windows应用程序中正常工作以测试其工作。

timerLonger= New System.Timers.Timer() 
    timerLonger.Interval = 30000 
    timerLonger.Enabled = True 

    timerShorter= New System.Timers.Timer() 
    timerShorter.Interval = 5000 
    timerShorter.Enabled = True 

    AddHandler timerLonger.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf Process1) 
    AddHandler timerShorter.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf Process2) 

Sub Process1() 
    timerLonger.Enabled = False 
    timerShorter.Enabled = False 
    DoProcessing1() 
    timerShorter.Enabled = True 
    timerLonger.Enabled = True 
End Sub 

Sub Process2() 
    timerLonger.Enabled = False 
    timerShorter.Enabled = False 
    DoProcessing2() 
    timerShorter.Enabled = True 
    timerLonger.Enabled = True 
End Sub 
+0

可能在添加处理程序后设置'Enabled'?另一方面,更可能的原因可能是线程问题。请参阅[文档](http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx)。我认为你应该每个线程只使用一个计时器。 – 2011-03-31 17:36:11

回答

4

当您禁用然后重新启用较长的计时器,它重置其时间。由于较短的一次经常发射6次,所以它永远没有机会执行。

而不是禁用定时器,如果目标是阻止两个定时器的同时操作,请考虑在您的方法周围使用某种形式的同步,例如SyncLock。

+0

我刚加入synclock而不是禁用定时器,它工作。非常感谢。 – Abbi 2011-03-31 19:53:31

+0

我对此还有一个问题。我试图禁用定时器,因为某些处理可能需要超过40秒,所以我不希望在所有处理完成之前触发任何定时器。这就是我把它放进去的原因。但我不知道synclock是否可以处理这个问题。 – Abbi 2011-03-31 21:20:11

+0

@Abbi:你最终会得到两个事件,一个接一个。计时器仍然会启动,但SyncLock会阻止处理,直到第一次完成。 – 2011-03-31 22:02:30

1

由于未处理的异常,您正在暴露自己的破损。不幸的是,System.Timers.Timer类在触发Elapsed事件时会在没有任何诊断的情况下吞下异常。在你的情况下,这也会使定时器永久禁用,因为异常绕过了再次启用它的语句。请务必在您的Elapsed事件处理程序中始终使用Try/Catch/Finally关键字。

或者使用System.Threading.Timer类,它是一个全能更好的计时器类。它不会吞食例外。

+0

感谢您的宝贵意见。我会把它放在试试看。 – Abbi 2011-03-31 19:54:17

相关问题