2012-09-21 33 views
115

Powiel możliwe:
How do you add a timer to a C# console applicationJaki jest najlepszy sposób na wdrożenie "timera"?

Jaki jest najlepszy sposób, aby wdrożyć czasomierza? Próbka kodu byłaby świetna! W przypadku tego pytania "najlepszy" jest definiowany jako najbardziej niezawodny (najmniejsza liczba niewypałów) i precyzyjny. Jeśli określę przedział 15 sekund, chcę, aby metoda docelowa była wywoływana co 15 sekund, nie co 10 - 20 sekund. Z drugiej strony nie potrzebuję dokładności nanosekund. W tym przykładzie dopuszczalne jest, że metoda będzie strzelać co 14.51 - 15.49 sekund.

+2

Innym wielkim pytaniem jest oznaczony jako duplikat bez użytecznego linku wskazując na dwóch egzemplarzach, które wyjaśnia to dobrze – pixel

Odpowiedz

206

Użyj klasy Timer.

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

public static void Main() 
{ 
    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
    aTimer.Interval=5000; 
    aTimer.Enabled=true; 

    Console.WriteLine("Press \'q\' to quit the sample."); 
    while(Console.Read()!='q'); 
} 

// Specify what you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    Console.WriteLine("Hello World!"); 
} 

Zdarzenie Elapsed wzrośnie ilość co X milisekund, określonego przez właściwości Interval na obiekcie timera. Będzie ona wywołać metodę Event Handler okreslic, w powyższym przykładzie jest to OnTimedEvent

+5

Czy timer wykonać na osobnym wątku? –

+7

@VaughanHilts, krótka odpowiedź, tak. Długa odpowiedź, recenzja [to odpowiedź SO] (http: // stackoverflow.com/a/1436331/1630665), który wyjaśnia, w którym wątku czas timera upływa bardzo dobrze. –

+3

Może ktoś, kto ma więcej uprawnień niż ja, może to zmienić: Właściwość Interwał określa liczbę milisekund, a nie sekund pomiędzy zdarzeniami. – Matthias

19

Nie jest jasne jaki rodzaj aplikacji, którą zamierzamy rozwijać (pulpit, www, konsolę ...)

The ogólną odpowiedzią, jeśli tworzysz aplikację Windows.Forms, jest użycie klasy

System.Windows.Forms.Timer. Zaletą tego jest to, że działa na wątku UI, więc po prostu zdefiniuj go, zasubskrybuj jego zdarzenie Tick i uruchamiaj kod co 15 sekund.

Jeśli robisz coś innego następnie Windows Forms (nie jest jasne, od kwestii), można wybrać System.Timers.Timer, ale to jeden działa na drugiej wątku, więc jeśli masz zamiar działać na niektórych elementów interfejsu z jego zdarzenie Elapsed, musisz zarządzać nim z dostępem "wywołującym".

26

Za pomocą klasy System.Windows.Forms.Timer można osiągnąć to, czego potrzebujesz.

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 


t.Interval = 15000; // specify interval time as you want 
t.Tick += new EventHandler(timer_Tick); 
t.Start(); 

void timer_Tick(object sender, EventArgs e) 
{ 
     //Call method 
} 

Używając metody stop() można zatrzymać stoper.

t.Stop(); 
+1

Jeśli posiadasz, możesz po prostu przeciągnąć kontrolkę timera do formularza z Zestawu narzędzi i robi to wszystko dla ciebie. –

+0

@RobSedgwick Tak, zgadzam się z tobą. możemy dodać sterowanie timerem za pomocą przybornika. Ale podejście, które udostępniłem, to za pomocą zegara dodawania czasu pracy. –

2

referencyjny ServiceBase do swojej klasy i umieścić poniższy kod w zdarzeniu OnStart:

Constants.TimeIntervalValue = 1 (godzina) .. Idealnie należy ustawić tę wartość w pliku konfiguracyjnym.

StartSendingMails = nazwa funkcji, którą chcesz uruchomić w aplikacji.

protected override void OnStart(string[] args) 
     { 
      // It tells in what interval the service will run each time. 
      Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000; 
      base.OnStart(args); 
      TimerCallback timerDelegate = new TimerCallback(StartSendingMails); 
      serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval)); 
     } 
+0

-1 OP wspomina o aplikacji konsolowej - nie ma powodu, aby wprowadzać klasy Usług Windows do tego. Zwłaszcza, gdy, aby rozwiązać problem, używasz tej samej klasy Timer, co zaakceptowana odpowiedź. – TarkaDaal

+3

jest wyświetlany w usłudze, ale ma zastosowanie do dowolnego kodu. Nie wspominając o @TarkaDaal. Konsola nie jest wymieniona w tym poście. tylko w możliwym duplikacie. –

Powiązane problemy