С# Timer.Elapsed Event срабатывает дважды подряд

У меня есть приложение, которое вызывает статические методы в DLL каждые 60 секунд как часть приложения «самопроверки» системы. Когда я вручную запускаю методы, все они выполняются менее чем за 10 секунд. Моя проблема в том, что событие timer.elapsed срабатывает дважды, одно за другим. Чтобы добавить к этому, каждый раз, когда таймер истекает, событие срабатывает еще раз. (например, в первый раз это 2 запуска, во второй раз 3, в третий раз 4 и т. д.) Я попытался установить timer.AutoReset = false вместе с установкой timer.Enabled = false в начале прошедшего события, а затем установить для него значение 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;
}

person daemonx1    schedule 01.02.2017    source источник
comment
Вы добавляете событие дважды.   -  person LarsTech    schedule 01.02.2017
comment
Спасибо @LarsTech. Я смотрел на это вечно и никогда не видел этого.   -  person daemonx1    schedule 06.02.2017


Ответы (1)


Кажется, ваша проблема связана с обработкой событий, которую вы делаете. Вы назначаете событие Elapsed более одного раза:

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

Почему это две строки?. У вас все будет хорошо только с этим:

cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);
person NicoRiff    schedule 01.02.2017
comment
И теперь я чувствую себя совершенно нелепо. Спасибо @nicoriff. - person daemonx1; 06.02.2017