2009-04-24 11 views

Odpowiedz

3

Timer.Stop() po 120 kleszcze.

+0

Negatywna miłość do prostej odpowiedzi? :) –

2

Zwróć uwagę na godzinę rozpoczęcia. W każdym wywołaniu sprawdź, czy currentTime + 5 sekund> startTime + 10 minut. Jeśli tak, wyłącz timer.

Preferuję to podejście, aby uruchomić po prostu dla N ticków, ponieważ nie można zagwarantować, że timery będą uruchamiane, gdy tego chcesz. Możliwe, że 120 tyknięć może przebiegać przez 10 minut czasu rzeczywistego.

3

po prostu użyj zmiennej DateTime, aby śledzić, kiedy powinna się zakończyć i ustawić ją tuż przed rozpoczęciem. Na twoim dotychczasowym programie obsługi zdarzeń sprawdź, czy czas sygnału jest krótszy niż czas zakończenia. Jeśli tak nie jest, zatrzymaj stoper.

3

Można obliczyć, ile razy funkcja będzie wywoływać funkcję i utworzyć licznik ubytków, po upływie którego zrezygnować z tykania zegara. Lub możesz uruchomić inny czasomierz, który ma okres zaznaczania - 10 min i po zaznaczeniu, że anulujesz subskrypcję licznika czasu, wywołując swoją funkcję.

6

Podziel Y minut przez interwał X, aby uzyskać ile razy trzeba uruchomić. Następnie wystarczy policzyć, ile razy funkcja została wywołana.

W twoim przypadku, 10 minut = 600 sekund/5 sekund = 120 połączeń potrzebnych. Wystarczy mieć licznik, aby śledzić, ile razy twoja funkcja została wywołana.

9

Przygotuj coś pętli czasowy takiego:

DateTime endTime = DateTime.Now.AddMinutes(10); 

while(endTime < DateTime.Now) 
{ 
    // Process loop 
} 
+2

Wolałbym przechowywać * czas zakończenia * i porównać go z wartością czasu teraźniejszego przed każdą iteracją. Niemniej jednak +1. – Cerebrus

+1

Masz rację, przechowywanie czasu końcowego byłoby lepsze. –

2

Można ustawić dwa liczniki jeden uruchamianych przez 5 sekund, a drugi, że prowadzony przez 10 minut i wyłączyć pierwszy

12

Wystarczy uchwycić czas, który chcesz zatrzymać, i zakończ swój licznik od wewnątrz programu obsługi. Oto przykład (uwaga: użyłem zegara System.Threading.Timer Wybierz odpowiedni timer dla wykonywanej czynności, na przykład możesz być po System.Windows.Forms.Timer, jeśli piszesz w WinForm)

 

public class MyClass 
{ 
    System.Threading.Timer Timer; 
    System.DateTime StopTime; 
    public void Run() 
    { 
     StopTime = System.DateTime.Now.AddMinutes(10); 
     Timer = new System.Threading.Timer(TimerCallback, null, 0, 5000); 
    } 

    private void TimerCallback(object state) 
    { 
     if(System.DateTime.Now >= StopTime) 
     { 
      Timer.Dispose(); 
      return; 
     } 
     // do your work..... 
    } 
} 
 
2

można użyć drugiego Timer:

class Program 
{ 
    static void Main(string[] args) 
    { 
     int interval = 5 * 1000; //milliseconds 
     int duration = 10 * 60 * 1000; //milliseconds 

     intervalTimer = new System.Timers.Timer(interval); 
     durationTimer = new System.Timers.Timer(duration); 

     intervalTimer.Elapsed += new System.Timers.ElapsedEventHandler(intervalTimer_Elapsed); 
     durationTimer.Elapsed += new System.Timers.ElapsedEventHandler(durationTimer_Elapsed); 

     intervalTimer.Start(); 
     durationTimer.Start(); 
    } 

    static void durationTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     intervalTimer.Stop(); 
     durationTimer.Stop(); 
    } 

    static void intervalTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //call your method 
    } 

    private static System.Timers.Timer intervalTimer; 
    private static System.Timers.Timer durationTimer; 
}