Почему System.Timer.Таймер по-прежнему запускает события, когда для параметра Enabled установлено значение false?

Я попытался создать производный класс Timer, который позволяет установить защелку Pause, чтобы рабочий поток не активировал таймер повторно. Однако события Elapsed продолжают возникать, когда AutoReset имеет значение false, а средство доступа Enabled, похоже, выполняет свою работу по предотвращению изменения свойства Enabled базового класса после установки переменной Paused.

Почему это происходит. происходит или какие стратегии мне следует использовать, чтобы лучше понять, какие взаимодействия здесь на самом деле происходят?

Я прикрепил реализацию производного класса ниже.

    using System.Timers
    class PauseableTimer : Timer
    {
      public bool Paused;
      new public bool Enabled
      { 
        get
        {
          return base.Enabled;
        } 
        set
        {
          if (Paused)
          {
            if (!value) base.Enabled = false;
          } 
          else
          {
            base.Enabled = value;
          }
        }
      }
    }

Пример, иллюстрирующий проблему.

class Program
{
    private static PauseableTimer _pauseableTimer;
    private static int _elapsedCount;
    static void Main(string[] args)
    {
        _pauseableTimer = new PauseableTimer(){AutoReset = false,Enabled = false,Paused = false};

        _pauseableTimer.Elapsed += pauseableTimer_Elapsed;
        _pauseableTimer.Interval = 1;
        _pauseableTimer.Enabled = true;
        while(_elapsedCount<100)
        {
            if (_elapsedCount > 50) _pauseableTimer.Paused = true;
        }
    }

    static void pauseableTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine(String.Format("this.Enabled:'{0}',Paused:'{1}',AutoReset:'{2}",_pauseableTimer.Enabled,_pauseableTimer.Paused,_pauseableTimer.AutoReset));
        _elapsedCount++;
        _pauseableTimer.Interval = _pauseableTimer.Interval == 1 ? 2 : 1; //This line breaks it.
        _pauseableTimer.Enabled = true;
    }
}
7
задан Erick 23 June 2011 в 15:28
поделиться