C# 定时器开火两次

C# 定时器开火两次,c#,timer,C#,Timer,我使用了stackoverflow的一些ex,但有时我的计时器会触发两次: 这个时钟应该每一分钟触发一次,但只要假设它触发00:00:59.666就可以了 然后步骤1=59; 步骤2=59; 步骤3=1; 返回1000-666;所以它不会在下一分钟发射,而是在下333毫秒发射,我能做什么 public int SyncTime = 60; Clock = new System.Timers.Timer {AutoReset = false}; Clock.Elapsed

我使用了stackoverflow的一些ex,但有时我的计时器会触发两次: 这个时钟应该每一分钟触发一次,但只要假设它触发00:00:59.666就可以了 然后步骤1=59; 步骤2=59; 步骤3=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);
    }

我怀疑问题在于:

Clock = new System.Timers.Timer {AutoReset = false};
我认为这应该是:

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

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

Ok不确定这是否是您的特定问题的答案,但GetSync函数计算的剩余时间不正确,直到整分钟

应该是,除非我错过了完全可能的东西:

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

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

您的代码不完整。。。你似乎在无关紧要的地方发表声明,其中一个没有半结肠。如果你能创建一个简短但完整的程序来演示这个问题,你就更有可能得到答案。另外,你什么时候同步?为什么?这是完整的,我甚至给了前如何这乐趣可以返回错误的值,我寻找答案你的缩写很难阅读。什么是前男友?我读你的课文没什么意思。乔恩·斯基特说的是第一行时钟。开始不要尾随分号。您在此处发布的代码不完整。Poster正在重新发出其DoWork函数中的start命令。No我只想启动一次,然后同步时间并再次启动,AutoReset=false表示计时器只启动一次