我在一项服务中使用 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
您可以看到计时器即使在停止后也会无限期地继续输出到控制台。您可以按回车键检查启用的计时器的值,以确认它仍在滴答作响时为假。它与勾选后重置间隔有关,但我不明白为什么如果设置间隔应该将其重新打开,为什么它没有显示为已启用以及为什么之后调用 stop 不会停止它.
我确定我只是遗漏了一些简单的东西,因此任何见解都将不胜感激。
更新
好像是autoreset=false和tick后重置间隔的组合。如果我设置 autoreset=true,重置间隔不会导致问题。如果我取消间隔重置,则 autoreset=false 功能正常。我已经在 .net 4 中测试过这个问题,那里也存在这个问题。通过使用 autoreset=true 并在计时器结束后立即手动关闭计时器,我为我的项目找到了解决方法,但我真的很想知道为什么它会以这种方式工作。
最佳答案
当使用 Elapsed 事件时,你应该设置 Timer.Enabled属性为 false 以禁用计时器。
关于.net - 使用 AutoReset = False 时,计时器在停止后仍在滴答作响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430505/