C# Timer.Elapsed Событие запускается дважды подряд

У меня есть приложение, которое вызывает статические методы в 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;
}

1 ответ

Решение

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

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

Почему это две строки? Вы будете в порядке только с этим:

cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);
Другие вопросы по тегам