Есть ли причина, по которой таймер имел бы AutoReset false, но затем снова запускается во время прошедшего события?

Я просто столкнулся с этим кодом, и я этого не понимаю. Есть ли причина использовать этот проект вместо повторного запуска прошедшего кода с помощью AutoReset true?

private readonly Timer Timer = new Timer();

protected override void OnStart(string[] args)
{
    Logger.InfoFormat("Starting {0}.", ServiceName);

    try
    {
        //  If Enabled is set to true and AutoReset is set to false, the Timer raises the Elapsed event only once, the first time the interval elapses.
        Timer.AutoReset = false;
        Timer.Elapsed += Timer_Elapsed;
        Timer.Interval = Settings.Default.ScriptingStatusLifeTime;
        Timer.Start();
    }
    catch (Exception exception)
    {
        Logger.ErrorFormat("An error has occurred while starting {0}.", ServiceName);
        Logger.Error(exception);
        throw;
    }
}

/// <summary>
/// Whenever the Schedule Service time elapses - go to the ScriptingStatus table
/// and delete everything created earlier than 1 hour ago (by default, read from ScriptingStatusLifeTime) 
/// </summary>
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    try
    {
        //  ScriptingStatusLifeTime defaults to 60 minutes.
        DateTime deleteUntil = DateTime.Now.AddMilliseconds(Settings.Default.ScriptingStatusLifeTime * -1);

        Logger.InfoFormat("Clearing all ScriptingStatus entries with ControlDate before: {0}.", deleteUntil);
        RemoteActivator.Create<RemoteScriptingStatus>().DeleteUntil(deleteUntil);
    }
    catch (Exception exception)
    {
        Logger.Error(exception);
    }
    finally
    {
        Timer.Start();
    }
}

Кроме того, я ищу память в этом коде.

Я просто прочитал это сообщение: Если для авторешетки установлено значение false, будет ли мой таймер автоматически удален?, который, по-видимому, подразумевает, что мой объект Timer должен быть удален правильно. Я не вижу никаких вызовов Dispose в текущем файле. Мне интересно, если это событие Timer_Elapsed также представляет утечку?

Ответ 1

Как я понимаю, при наличии AutoReset в true, событие таймера, которое запускается, может перекрываться, где время, которое принимает событие для выполнения, выходит за пределы значения таймаута.

Например, время ожидания 10 секунд, но рабочая нагрузка 1 минута.

Однако с AutoReset как false, событие таймера будет запускаться только один раз. Вы можете перезапустить таймер в своем событии, и таймер может продолжить.

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

Это в значительной степени, как я это делаю, а также как вы его используете в своем примере кода.

Добавление: Приведенное выше верно, только если вы не устанавливаете объект синхронизации, потому что прошедшее событие поднимается в пуле потоков. Если вы установите объект синхронизации, я ожидаю блокировку для блокирования прошедшего события, чтобы только одно событие могло срабатывать одновременно.