【问题标题】:Timer still ticking after stop when using AutoReset = False使用 AutoReset = False 时停止后计时器仍在滴答作响
【发布时间】: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 存在的原因。

标签: .net vb.net timer


【解决方案1】:

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

【讨论】:

  • 不管用stop还是enabled=false,都一样的效果。
  • 你在哪里设置 Timer_Elapsed 作为事件处理程序?我认为您可能需要这样做:AddHandler Timer.Elapsed, AddressOf Timer_Elapsed.
  • 我使用的是 VB.NET WithEvents/Handles,但我在函数开始时将其更改为 addhandler,但仍然遇到同样的问题。
  • 我认为问题在于您在设置间隔属性之后告诉计时器停止。有关 AutoReset 属性,请参阅 MSDN 页面上的备注:msdn.microsoft.com/en-us/library/…
  • 我实际上是在停止之前设置间隔属性,但我只是为了检查而将其切换,但仍然是同样的问题。我真的不明白这些言论如何适用。似乎是说我必须在 autoreset = false 过去后重新启动计时器(这是我想要的行为),并且重置间隔不考虑以前经过的时间。它似乎没有说明在启用时引发经过的事件是错误的。另外,感谢您抽出宝贵时间查看此内容。
【解决方案2】:

你也可以通读这个帖子。

Which .Net Timer() to use

我使用 System.Timers.Timer 的结果好坏参半,Windows.Forms.Timer 似乎更直观地工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多