C#Timer.Elapsed事件连续两次触发

时间:2017-02-01 20:34:53

标签: c# timer elapsed system.timers.timer

我有一个应用程序,每60秒调用一次DLL中的静态方法作为系统的一部分"自我检查"应用。当我手动运行这些方法时,它们都会在不到10秒的时间内完成。我的问题是timer.elapsed事件是两次触发,一次是另一次。除此之外,每次计时器过去时,事件再次触发。 (例如,第一次它的2次点火,第二次点击3次,第三次点击4次等)我试过设置timer.AutoReset = false以及设置timer.Enabled = false at已结束事件的开始,然后在事件结束时将其设置为true。我已经尝试重置事件中的间隔。我发现的每个帖子都表明上述操作应该已经解决了这个问题。任何人都可以帮我找到我失踪的东西吗?

static Timer cycle = new Timer();
static int cycCount = 0;
static void Main(string[] args)
{
    Console.WriteLine("Firebird Survivor Auto Cycle Started.");

    Console.CancelKeyPress += Console_CancelKeyPress;

    cycle.Interval = 60000; //set interval for service checks.
    cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);
    cycle.AutoReset = false;
    cycle.Enabled = true;

    cycle.Elapsed += CycleComplete_Elapsed; 

    while (1 == 1) //stop main method from completing indefinitely
    {
        //WAIT FOR TIMER TO ELAPSE
    }

}

private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
    cycle = null;
}

static void CycleComplete_Elapsed(object sender, ElapsedEventArgs e) //method triggered by timer
{
    cycle.Enabled = false;

    cycCount++;

    WormholeServiceControls.CheckWormHoleStatus();
    TimeControls.CheckTimePl(); //call time check
    PegasusServiceControls.CheckPegasusStatus(null);

    Console.Clear();
    Console.WriteLine("--------------------------");
    Console.WriteLine(String.Format("| Successful Cycles: {0} |", cycCount));
    Console.WriteLine("--------------------------");

    cycle.Enabled = true;
}

1 个答案:

答案 0 :(得分:1)

您的问题似乎来自您正在进行的事件处理。您要多次分配Elapsed个事件:

cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);
cycle.Elapsed += CycleComplete_Elapsed; 

为什么这两行?只有这样你就可以了:

cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);