计时器开火两次

时间:2010-11-29 23:47:18

标签: c# timer

我从stackoverflow使用了一些ex但有时我的计时器点火了两次: 这个时钟应该每一分钟发射一次,但只是假设它发射00:00:59.666 然后step1 = 59; step2 = 59; step3 = 1; 返回(1000-666);所以它不应该在下一分钟开火但下一个333米利秒,我该怎么办?

public int SyncTime = 60;
Clock = new System.Timers.Timer {AutoReset = false};
            Clock.Elapsed += DoJob;
            Clock.Interval = GetSync(SyncTime);
            Clock.Start()
   private void DoJob(object sender, ElapsedEventArgs elapsedEventArgs)
   {

            Clock.Interval = GetSync(SyncTime);
            Clock.Start();

    }
    private static double GetSync(int syncTime)
    {
        DateTime now = DateTime.Now;
        int step1 = (now.Minute * 60 + now.Second); //amount of miliseconds in this hour
        int step2 = step1 % syncTime;               //amount of miliseconds since last update
        int step3 = syncTime - step2;               //amount of miliseconds to next upadte
        return (step3 * 1000 - now.Millisecond);
    }

2 个答案:

答案 0 :(得分:0)

我怀疑问题在于:

Clock = new System.Timers.Timer {AutoReset = false};

我认为这应该是:

Clock = new System.Timers.Timer {AutoReset = true};

这意味着计时器只会触发一次,直到您重新发出Start命令。

答案 1 :(得分:0)

好的不确定这是否是您特定问题的答案,但您的GetSync功能正在计算错误的整个分钟的剩余时间。

它应该是(除非我遗漏了一些完全可能的东西):

private static double GetSync(int syncTime)
{
  DateTime now = DateTime.Now;      
  return ((2 * syncTime) - now.Second) * 1000) - now.Millisecond; 
}

这可能会解决您的问题,因为以这种方式计算剩余时间永远不会导致您从GetSync返回0值。

编辑:误解了计算增加了2 *同步时间,如果我理解正确的话,现在会正确计算它。