.net - 使用 AutoReset = False 时,计时器在停止后仍在滴答作响

标签 .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

您可以看到计时器即使在停止后也会无限期地继续输出到控制台。您可以按回车键检查启用的计时器的值,以确认它仍在滴答作响时为假。它与勾选后重置间隔有关,但我不明白为什么如果设置间隔应该将其重新打开,为什么它没有显示为已启用以及为什么之后调用 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/

相关文章:

javascript - Actionscript 2 Setinterval向计时器添加毫秒

c# - 如何将 RibbonGroup 向右对齐?

vb.net - 在 VB 中使用 Excel 数据填充 DataGrid 列

mysql - 如何使用vb.net检查记录是否存在,如果不存在则插入?

ios - 是否可以在 Today Widget 中刷新计时器?

c - 将一次性超时计时器与 sqlite 表中的一行关联

c# - 如何从 .Net 中删除 cookie

c# - Json.NET - 将 EmptyOrWhiteSpace 字符串属性转换为 null

.net - 更新 VB.NET 中的 MySQL 字段

.net - MSBuild 在 VB.NET lambda 表达式上失败