Как 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;