Istnieją trzy Timer
klasy, że jestem świadom, System.Threading.Timer
, System.Timers.Timer
, i System.Windows.Forms.Timer
, ale żaden z nich posiada .Reset()
funkcję, która będzie zresetować aktualny czas, jaki upłynął do 0.
Czy istnieje klasa BCL, która ma taką funkcjonalność? Czy można to zrobić w inny sposób niż hack? (Pomyślałem, że być może zmiana limitu czasu może go zresetować). Zastanawiałem się, jak trudno byłoby ponownie zaimplementować Timer
klasę, która ma tę funkcjonalność, lub jak zrobić to niezawodnie z jedną z klas BCL?
Odpowiedzi:
Zawsze to robię ...
... czy to hack? :)
Zgodnie z komentarzem w Threading.Timer, to metoda Change ...
źródło
Forms.Timer
powinno być używane tylko z graficznym interfejsem użytkownika. Jednak opróczForms.Timer
iThreading.Timer
jest teżTimers.Timer
.Wszystkie liczniki czasu mają odpowiedniki metod Start () i Stop (), z wyjątkiem System.Threading.Timer.
Więc metoda rozszerzenia, taka jak ...
... jest jednym ze sposobów, aby to osiągnąć.
źródło
timer.Start()
. Zrobiłem to zapytanie Linqpad, aby to przetestować. Spróbuj go usunąćtimer.Stop
, a zobaczysz różnicę.Na
System.Timers.Timer
według dokumentacji MSDN http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx :Więc,
źródło
Możesz napisać metodę rozszerzającą o nazwie Reset (), która
źródło
Właśnie przypisałem nową wartość do timera:
to działa dobrze dla mnie.
u góry kodu zdefiniuj licznik czasu:
System.Threading.Timer myTimer;
źródło
Dla jasności, ponieważ niektóre inne komentarze są niepoprawne, użycie
System.Timers
ustawienia Enabled na true spowoduje zresetowanie czasu, który upłynął. Właśnie przetestowałem zachowanie z poniższym:Wielokrotnie wprowadzałem tekst do pola tekstowego, a licznik czasu działałby tylko 3 sekundy po ostatnim naciśnięciu klawisza. Jest to również zasugerowane w dokumentach, jak zobaczysz: wywołanie
Timers.Start()
po prostu ustawia Enabled na true.I dla pewności, do czego powinienem od razu przejść od samego początku, w źródle referencyjnym .NET zobaczysz, że jeśli włączysz już włączony licznik czasu, wywoła on
UpdateTimer()
metodę prywatną , która wywołuje wewnętrznieChange()
.źródło
UpdateTtimer
jest wywoływana wtedy i tylko wtedy, gdy bieżąca wartośćEnabled
nie jest równa newvalue
.Dla timera (System.Windows.Forms.Timer).
Metody .Stop, a następnie .Start działały jako reset.
źródło
Innym alternatywnym sposobem resetowania windows.timer jest użycie licznika w następujący sposób:
Jeśli więc zamierzasz powtarzać co 1 sekundę, możesz ustawić interwał timera na 100 ms i przetestować licznik na 10 cykli.
Jest to odpowiednie, jeśli licznik czasu ma czekać na niektóre procesy, które mogą zostać zakończone w innym przedziale czasu.
źródło
robię to
źródło
Możesz to zrobić
timer.Interval = timer.Interval
źródło