2010-07-08 16 views
6

Chcę wyzwalać KillZombies każdej nocy o północy. Problem polegający na tym, że pierwszy interwał czasowy jest zachowany i nie jest resetowany do 86400000 milisekund, co próbuję wykonać w mojej metodzie.Timer.Interval Question

Czy istnieje sposób na usunięcie starego interwału i zastąpienie go nowym?

System.Timers.Timer Timer = new System.Timers.Timer(); 
Timer.Elapsed += new ElapsedEventHandler(KillZombies); 
Timer.Interval = MillisecondsToMidnight; 
Timer.Start() 

private void KillZombies(object source, ElapsedEventArgs e) 
{ 
//Kill zombies 
Timer.Interval = 86400000; //Milliseconds per 24 hours 
} 
+0

Nie jestem pewien, czy jest to poprawne, czy nie, ale chciałbym spróbować zatrzymać, a następnie zresetować interwał, a następnie uruchomić go ponownie. –

+0

@NickLarsen Pokonałbyś zaakceptowaną odpowiedź, jeśli umieścisz to jako odpowiedź zamiast komentarza :-) – dotnetguy

Odpowiedz

9

FWIW, przy użyciu programatorów, zawsze należy ustawić właściwość AutoReset do false. Zapobiega to ponownemu uruchomieniu timera, więc musisz zadzwonić pod numer Timer.Start(), aby ponownie rozpocząć odliczanie. Uniknęłoby to dodatkowych wywołań do Stop() Ponadto, aby uzyskać wyraźne informacje, potrzebowałbym funkcji, która za każdym razem obliczała milisekundy na północy i każdorazowo przypisywała do przedziału czasowego. Czyni twój kod bardziej klarownym. Ponadto, jeśli użyjesz Timer.AutoRest = false, licznik czasu nie zacznie się liczyć, dopóki nie zadzwonisz pod numer Timer.Start(), co oznacza, że ​​jeśli połączysz wywołanie Start() na końcu metody KillZombies i ta metoda zajmie 5 sekund, Twój czasomierz powinien być 86400000 - 5000 . Ta 5-sekundowa zmiana zwiększyłaby się z czasem.

+0

chciałem napisać to samo :-) –

+1

+1 za wzmiankę o błędzie akumulacji –

+0

Błąd w kumulacji, nigdy nawet nie przyszło mi do głowy. Zmienię kod, aby za każdym razem przeliczać milisekundy na północ. Dzięki! – sooprise

1

Spróbuj zadzwonić Stop(), potem Start() ing go ponownie.

+0

Po linii: Timer.Interval = 86400000; ? – sooprise

+0

'Stop' przed,' Rozpocznij' po. – SLaks

+0

Czy możesz wyjaśnić, co się dzieje, gdy licznik przestaje działać, gdy interwał zostanie zresetowany w przeciwieństwie do utrzymywania licznika czasu, gdy interwał zostanie zresetowany? – sooprise

4

Hmmmm ... wydaje mi się problemem z planowaniem.

Dlaczego nie coś bardziej dostosowanego do zadań planowania, takich jak Quartz.NET? W ten sposób nie musisz się martwić ustawianiem Timera, który będzie uruchamiany o północy, a następnie modyfikowaniem go później.

Jeśli naprawdę przeciwieństwie do ram planowania, można spróbować:

private void KillZombies(object source, ElapsedEventArgs e) 
{ 
    //Kill zombies 
    Timer.Stop(); 
    Timer.Interval = 86400000; //Milliseconds per 24 hours 
    Timer.Start(); 
} 
+0

Dla mojego obecnego projektu, potrzebuję mojej metody zabijania zombie, aby po prostu zadziałała. Nie ma żadnych innych zaplanowanych zadań, które powinienem uruchomić, więc użycie frameworka wydaje się trochę przesadzone, aby wykonać jedno zadanie. Mogę się mylić, ale teraz, po prostu muszę sprawić, żeby ta rzecz zadziałała. Będę pamiętać o Quartz dla przyszłych projektów wymagających intensywnych zadań planowania (co jest całkiem prawdopodobne). – sooprise

1

Zamiast taki duży odstęp chciałbym zamiast używać odstępie może jeden sekundę (lub minutę) i sprawdzić DateTime.Now a jeśli osiągnęło pożądaną wartość, rozpocznij pracę.

System.Timers.Timer Timer = new System.Timers.Timer(); 
Timer.Elapsed += new ElapsedEventHandler(KillZombies); 
Timer.Interval = 60000; 
Timer.Start() 

private void KillZombies(object source, ElapsedEventArgs e) 
{ 
    if((DateTime.Now - DateTime.Today) < new TimeSpan(0, 1, 0)) 
    { 
     //ToDo: Kill Zombies 
    } 
} 
Powiązane problemy