【问题标题】:Loop to check time in VB.NET循环检查 VB.NET 中的时间
【发布时间】:2009-11-03 00:17:36
【问题描述】:

所以我对 VB 有点陌生,只是在玩一个小项目,我目前需要一个循环来不断检查系统时钟,看看它是否等于某个时间。

   While Not myTime.Hour = 24

        If TimeOfDay = newTime Then
            nfi.ShowBalloonTip(15)
            intRandNumb = RandomNumber(1, 15)
            dblAddMinutes = intTime + intRandNumb
            newTime = TimeOfDay.AddMinutes(dblAddMinutes)

        End If
    End While

我现在有这个,但显然它正在停止一切并在此过程中使用我 50% 的 cpu,我只是想知道我可以替换或更改什么以使这个循环运行得更好并执行我需要它。

【问题讨论】:

    标签: vb.net datetime loops while-loop


    【解决方案1】:

    你可以添加

    Threading.Thread.Sleep(0),
    

    这将导致上下文切换并大大降低 CPU 使用率

    还可以考虑使用每 10 或 100 毫秒调用一次的计时器对象,这样使用起来也会比使用循环更好

    【讨论】:

    • 我之前从未使用过计时器对象,在这种情况下我将如何实现一个?
    • 查看@Grizzly 了解如何实施 Timer 解决方案
    【解决方案2】:

    你可以使用

    Threading.Thread.Sleep(0)
    

    这将导致工作线程产生其当前时间片的其余部分,这将大大减少 CPU 使用率。但是,您应该考虑您是否真的忙于等待时间,或者您是否可以设置一个计时器来倒计时当前时间和预期时间之间的差异,例如:

                var t = new System.Timers.Timer((DateTime.Now - DateTime.Now).TotalMilliseconds);
            t.Elapsed = DoSomething;
            t.Start();
    

    【讨论】:

    • 所以,如果我没看错的话,它会创建一个以毫秒为单位的计时器,以两者之间的差异为单位,并在计时器过去后做些什么?抱歉,我以前从未使用过计时器。
    • 是的,这正是预期的行为(当然,这段代码是 c#,所以在 vb.net 中使用它时存在小的语法差异,但除此之外......)
    • 当然,哇,非常感谢您的帮助。你在短时间内教会了我一些好东西。
    【解决方案3】:

    检查系统时钟是否等于某个时间。

    有两种“正确”的方法可以做到这一点:

    1. 构建一个不关心现在是什么时间的普通应用,并在 Windows 中将其设置为计划任务。
    2. 检查时间一次并计算距离所需时间还有多长时间。然后设置一个计时器来等待确切的持续时间。

    在任何情况下,您都不应继续轮询系统时钟以获取类似这样只会运行一次的东西。

    【讨论】:

    • 基于问题中的代码示例,我会说选项 2 更正确!而且我自己也经常使用这种方法。
    【解决方案4】:

    正如 Joel 所指出的,您应该尝试改用计时器。我不确定你的应用是表单还是控制台或其他,所以我会尽量通用并使用System.Timers.Timer

    这里的代码(间隔设置为10ms,改成你需要的值):

    Private timer1 As System.Timers.Timer    
    Const interval As Integer = 10 
    
    
    Sub initTimer()
        timer1 = New System.Timers.Timer(10)
        AddHandler timer1.Elapsed, AddressOf Me.timer_Elapsed
        timer1.Start()
    End Sub
    
    Sub timer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
        'do your stuff here
        'Console.WriteLine(e.SignalTime.ToString())
    End Sub
    

    【讨论】:

    • 哎呀,我没有意识到灰熊做了一个样本。我的是VB。我是 C#-er,所以我花了一段时间才把代码弄出来。
    • 感谢您的宝贵时间,这真的很有帮助,现在一切运行顺利。
    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多