Как reset таймер в С#?

Есть три класса Timer, о которых я знаю, System.Threading.Timer, System.Timers.Timer и System.Windows.Forms.Timer, но ни одна из них не имеет функции .Reset(), которая бы reset текущее прошедшее время равнялось 0.

Существует ли класс BCL, который имеет эту функциональность? Есть ли способ взломать это? (Я думал, возможно, что с ним можно было бы ограничить время) reset it) Мысль о том, насколько сложно было бы переопределить класс Timer, который имел эту функциональность, или как сделать это надежно с одним из классов BCL?

Ответ 1

Я всегда делаю...

myTimer.Stop();
myTimer.Start();

... это взлом?:)

В комментарии к Threading.Timer это Измените метод...

dueTime Тип: System.Int32количество времени для задержки до вызов указанного метода обратного вызова когда Таймер был построен, в миллисекунды. Указывать Timeout.Infinite, чтобы предотвратить таймер от перезапуска. Укажите нуль (0), чтобы немедленно перезапустить таймер.

Ответ 2

Все таймеры имеют эквивалент методов Start() и Stop(), за исключением System.Threading.Timer.

Итак, метод расширения, такой как...

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}

... это один из способов сделать это.

Ответ 3

Для System.Timers.Timer, согласно документации MSDN, http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx:

Если интервал установлен после запуска таймера, счетчик reset. Например, если вы установите интервал в 5 секунд, а затем установите свойство Enabled - true, счетчик начинается с момента, когда Enabled задавать. Если вы reset интервал до 10 секунд, когда счетчик составляет 3 секунды, Событие "Истекшее" поднимается в первый раз через 13 секунд после Включено установлено значение true.

Итак,

    const double TIMEOUT = 5000; // milliseconds

    aTimer = new System.Timers.Timer(TIMEOUT);
    aTimer.Start();     // timer start running

    :
    :

    aTimer.Interval = TIMEOUT;  // restart the timer

Ответ 4

Вы можете написать метод расширения с именем Reset(), который

  • вызывает Start() - Stop() для Timers.Timer и Forms.Timer
  • вызывает изменение для Threading.Timer

Ответ 5

Я просто назначил новое значение таймеру:

mytimer.Change(10000, 0); // reset to 10 seconds

он отлично работает для меня.

в верхней части кода определите таймер: System.Threading.Timer myTimer;

if (!active)
        {
            myTimer= new System.Threading.Timer(new TimerCallback(TimerProc));
        }
        myTimer.Change(10000, 0);
        active = true;

private void TimerProc(object state)
    {
        // The state object is the Timer object.
        System.Threading.Timer t = (System.Threading.Timer)state;
        t.Dispose();
        Console.WriteLine("The timer callback executes.");
        active = false;
        //action to do when timer is back to zero
    }

Ответ 6

Для таймера (System.Windows.Forms.Timer).

.Stop, затем .Start методы работают как reset.

Ответ 7

Другим альтернативным способом reset, который используется в windows.timer, используется:

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

private void mTimer_Tick()
{
  tmrCtr++;
  //perform task
}  

Итак, если вы намереваетесь повторять каждые 1 секунду, вы можете установить интервал таймера на 100 мс и проверить счетчик на 10 циклов.

Это подходит, если таймер должен ждать некоторых процессов, которые могут быть завершены в разное время.

Ответ 8

Вы можете сделать timer.Interval = timer.Interval

Ответ 9

Для ясности, поскольку некоторые другие комментарии неверны, при использовании параметра System.Timers Enabled для true будет reset прошедшего времени. Я просто проверил поведение с приведенным ниже:

Timer countDown= new Timer();

Main()
{
    TextBox.TextDidChange += TextBox_TextDidChange;
    countdown.Elapsed += CountDown_Elapsed;
}

void TextBox_TextDidChange(Object sender, EventArgs e)
{
    countdown.Enabled = true;
}

void CountDown_Elapsed(object sender, EventArgs e)
{
    System.Console.WriteLine("Elapsed");
}

Я бы несколько раз вводил текст в текстовое поле, и таймер работал только через 3 секунды после последнего нажатия клавиши. Это также намечено в документах, так как вы увидите, что вызов "Timers.Start()" просто устанавливает Enabled в true.

И, конечно же, с чего я должен был просто перейти с самого начала, вы увидите в .NET reference source чтобы при включении уже включенного таймера он вызывал частный метод UpdateTimer(), который внутренне вызывает Change().

Ответ 10

Я делаю это

//Restart the timer
queueTimer.Enabled = true;