您好我已经创建了一个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 :(得分:4)
当您禁用然后重新启用较长的计时器时,它会重置其时间。由于较短的一次频繁发射6次,因此永远不会有机会执行。
如果目标是防止同时操作两个计时器,而不是禁用计时器,请考虑在方法周围使用某种形式的同步,例如SyncLock。
答案 1 :(得分:1)
由于未处理的异常,您将面临破产。不幸的是,System.Timers.Timer类在触发Elapsed事件时吞没了没有任何诊断的异常。在您的情况下,这也会使计时器永久禁用,因为异常会绕过再次启用它的语句。请务必始终在Elapsed事件处理程序中使用Try / Catch / Finally关键字。
或者使用System.Threading.Timer类,它是一个全能的更好的计时器类。它不会吞下例外。