【发布时间】:2011-09-19 19:19:43
【问题描述】:
我在一项服务中使用 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 并在经过后立即手动关闭计时器,我为我的项目找到了一种解决方法,但我真的很想知道为什么它会以这种方式工作。
【问题讨论】:
-
System.Timers.Timer 在很多方面都是邪恶的。这就是 System.Threading.Timer 存在的原因。