Как сбросить таймер в C#?



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

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

180   10  

10 ответов:

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

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

... это хак? :)

за комментарий, на нитку.Таймер, это изменить метод ...

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

все таймеры имеют эквивалент методов Start() и Stop (), кроме System.Нарезка резьбы.Таймер.

таким образом, метод расширения, например...

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

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

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

если интервал установлен после запуска таймера, то счетчик равен сброс. Например, если установить интервал в 5 секунд, а затем установить свойство Enabled имеет значение true, счетчик начинается в момент включения набор. Если вы сбросите интервал до 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

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

  • вызовы Stop () - Start () для таймеров.Таймер и формы.Таймер
  • изменения вызовов для потоковой передачи.Таймер

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

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
    }

для таймера (системы.Окна.Формы.Таймер.)

The .Тогда остановись .Методы запуска работали как сброс.

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

Timer countDown= new Timer(3000);

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 секунды после последнего нажатия клавиши. На это намекают и в документах, как вы увидите: calling Timers.Start() просто устанавливает значение true.

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

другой альтернативный способ сброса windows.таймер использует счетчик следующим образом:

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

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

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

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

Я делаю это

//Restart the timer
queueTimer.Enabled = true;

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

    Ничего не найдено.

Добавить ответ:
Отменить.