【问题标题】:Stopwatch not working with 24 hours intervals but worked with a shorter periods like minutes秒表不以 24 小时为间隔工作,而是以更短的时间间隔工作,如分钟
【发布时间】:2020-08-27 04:09:27
【问题描述】:

秒表不是以 24 小时为间隔工作,而是以更短的时间间隔工作,例如分钟

Dim s1 As Stopwatch = New Stopwatch()
        s1.Start()
        'Dim starttime As String = DateTime.Now.ToString()
        While s1.Elapsed < TimeSpan.FromHours(24)
        End While

相同的代码可以正常工作 使用此方法时 TimeSpan.FromMinutes(1440) 代替 TimeSpan.FromHours(24)

【问题讨论】:

  • 首先,这是可怕的代码。这就是所谓的“忙等待循环”,它是可能的最卑鄙的代码结构之一。永远不要使用不做任何事情来等待特定状态的循环。如果可能,请依赖事件。在这种情况下,如果您想等待 24 小时,那么您可以启动 Timer 并将 Interval 设置为 24 小时。这不会完全精确,但非常接近。如果您需要更近的时间,请使用将近 24 小时的 Interval,然后在第一个 Tick 之后将其更改为 1 秒。
  • 如果您确实需要使用循环,那么您至少应该在其中设置睡眠/延迟,这样您就不会一直使用 100% 的 CPU。
  • 至于问题,与报道的Stopwatch无关。无论您使用TimeSpan.FromHours 还是TimeSpan.FromMinutes,您仍然会生成TimeSpan,这就是您要与Stopwatch.Elapsed 进行比较的内容。 TimeSpanTimeSpan,无论它是如何创建的。为了使比较在一种情况下而不是另一种情况下起作用,这两种TimeSpan 方法必须产生不同的结果。除非你的系统坏了,否则它们不会。问题是另外一回事。你真的是在用一整天的时间来测试你的 CPU 吗?不好!

标签: .net vb.net setinterval stopwatch


【解决方案1】:

基于 jmcilhinney 的 cmets。

    Dim s1 As Stopwatch = New Stopwatch()
    s1.Start()
    Dim ts1 As TimeSpan = TimeSpan.FromHours(24.0#)
    Dim ts2 As TimeSpan = TimeSpan.FromMinutes(24.0# * 60.0#)
    Stop 'look at ts1 and ts2.  are they the same?
    'While s1.Elapsed < ts2
    While s1.Elapsed < ts1
        Threading.Thread.Sleep(250)
    End While

展示了这一点,他的第一条评论应该被注意了。

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多