在同一代码中以不同间隔触发的两个不同定时器变量的问题

时间:2011-03-31 17:31:39

标签: .net vb.net

您好我已经创建了一个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

2 个答案:

答案 0 :(得分:4)

当您禁用然后重新启用较长的计时器时,它会重置其时间。由于较短的一次频繁发射6次,因此永远不会有机会执行。

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

答案 1 :(得分:1)

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

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