使用AutoReset = False时,定时器在停止后仍然在滴答作响

时间:2011-06-21 18:55:34

标签: .net vb.net timer

我在一个服务中使用System.Timers.Timer,它似乎在被禁用后继续滴答作响。我正在使用autoreset = false所以我希望它只能打一次,除非我再次启动它。我再次呼叫停止,只是为了好的措施,但计时器继续滴答作响。我在.net 1.1中使用VB.NET,并且没有更改框架的选项。

这是一个简单的控制台应用程序来重现该问题。这不是项目的实际代码。我认为间隔很长,以防止任何线程问题多次提升事件,但我承认我不是线程专家。

Module Module1
Private Timer As New System.Timers.Timer(10000)


Sub Main()
    AddHandler Timer.Elapsed, AddressOf Timer_Elapsed

    Timer.AutoReset = False
    Timer.Start()

    While True
        Console.ReadLine()
        Console.WriteLine("Timer Enabled: " & Timer.Enabled)
    End While

End Sub

Private Sub Timer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
    Console.WriteLine("Timer Tick")
    Timer.Interval = 15000
    Timer.Stop()  'using timer.enabled = false here nets the same effect

End Sub
End Module

您可以看到计时器将在停止后无限期地继续输出到控制台。您可以按Enter键检查启用的计时器的值,以确认它在仍在滴答作响时为false。它与已经勾选后重置的间隔有关,但我不明白为什么它没有显示为启用如果设置间隔应该重新打开以及为什么之后调用停止不会停止它

我确信我只是遗漏了一些简单的东西,所以任何见解都会受到赞赏。

更新

似乎是autoreset = false的组合并且在tick之后重置间隔。如果我设置autoreset = true,重置间隔不会导致问题。如果我取出间隔重置,autoreset = false功能正常。我已经在.net 4中对此进行了测试,问题也存在。我通过使用autoreset = true并在经过后立即手动关闭计时器为我的项目找到了一个解决方法,但我真的很想知道它为什么会这样工作。

2 个答案:

答案 0 :(得分:0)

使用Elapsed事件时,应将Timer.Enabled属性设置为false以禁用计时器。

答案 1 :(得分:0)

你也可以通读这个帖子。

Which .Net Timer() to use

我使用System.Timers.Timer获得了混合结果,Windows.Forms.Timer似乎更直观地工作。