Как сбросить таймер в C#?
три Timer классы, о которых я знаю,System.Threading.Timer,System.Timers.Timer и System.Windows.Forms.Timer, но ни один из них не имеет .Reset() функция, которая сбросит текущее затраченное время до 0.
есть ли класс BCL, который имеет эту функциональность? Есть ли способ сделать это без взлома? (Я думал, что, возможно, изменение ограничения по времени на него может сбросить его) думал о том, как трудно было бы переопределить a Timer класс, который имел эту функциональность, или как это сделать надежно с одним из BCL занятия?
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 }
для ясности, так как некоторые другие комментарии неверны, при использовании
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 циклов.
это подходит, если таймер должен ждать некоторых процессов, которые могут быть завершены в другой промежуток времени.
Comments