2012-09-21 18 views
115

Mögliche Duplizieren:
How do you add a timer to a C# console applicationWas ist der beste Weg, um einen "Timer" zu implementieren?

Was ist der beste Weg, um einen Timer zu implementieren? Ein Codebeispiel wäre großartig! Für diese Frage wird "am besten" als am zuverlässigsten (kleinste Anzahl von Fehlzündungen) und präzise definiert. Wenn ich ein Intervall von 15 Sekunden vorschlage, möchte ich die Zielmethode alle 15 Sekunden aufrufen, nicht alle 10 - 20 Sekunden. Auf der anderen Seite brauche ich keine Genauigkeit im Nanosekundenbereich. In diesem Beispiel wäre es akzeptabel, dass die Methode alle 14,51 bis 15,49 Sekunden ausgelöst wird.

+2

Eine weitere große Frage ohne jede nützliche Verbindung als Duplikat markiert werden, um das Duplikat zeigt, dass dies auch auf einem separaten Thread – pixel

Antwort

206

Verwenden Sie die Klasse 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!"); 
} 

Die Elapsed Veranstaltung wird jede X Anzahl von Millisekunden, durch die Interval Eigenschaft auf dem Timer-Objekt angegeben angehoben werden. Es wird die Event Handler Methode aufrufen Sie im Beispiel angeben, darüber OnTimedEvent

+5

Hat der Timer ausführen erklärt? –

+7

@VaughanHilts, kurze Antwort, Ja. Lange Antwort, überprüfen [diese SO Antwort] (http: // stackoverflow.com/a/1436331/1630665) erläutert, in welchem ​​Thread der Timer sehr gut abläuft. –

+3

Vielleicht kann jemand mit mehr Privilegien als ich dies bearbeiten: Die Eigenschaft Interval gibt die Anzahl der Millisekunden, nicht Sekunden zwischen den Ereignissen. – Matthias

19

ist Es ist nicht klar , welche Art von Anwendung, die Sie (Desktop, Web, Konsole ...)

Die Entwicklung gehen allgemeine Antwort, wenn Sie Windows.Forms Anwendung entwickeln, ist die Verwendung von

System.Windows.Forms.Timer Klasse. Der Vorteil davon ist, dass es auf Thread läuft, so dass es einfach ist, definieren Sie es einfach, abonnieren Sie sein Tick Ereignis und führen Sie Ihren Code alle 15 Sekunden.

Wenn Sie etwas anderes tun, dann Windows Forms (es ist nicht klar von der Frage), können Sie System.Timers.Timer wählen, aber diese läuft man auf anderen Faden, so dass, wenn Sie auf einige Elemente der Benutzeroberfläche handeln gehen aus Das Ereignis Elapsed muss mit "Aufruf" -Zugriff verwaltet werden.

26

Mit der System.Windows.Forms.Timer Klasse können Sie erreichen, was Sie brauchen.

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 
} 

Mit der stop() Methode können Sie den Timer stoppen.

t.Stop(); 
+1

Wenn Sie einen haben, können Sie einfach ein Timer-Steuerelement aus der Toolbox auf Ihr Formular ziehen und es macht alles für Sie. –

+0

@RobSedgwick Ja, ich stimme dir zu. Wir können die Timersteuerung über die Toolbox hinzufügen. Aber der Ansatz, den ich geteilt habe, ist über den Runtime-Add-Timer. –

2

Referenz ServiceBase Ihre Klasse und setzen Sie den Code unten in der OnStart Veranstaltung:

Constants.TimeIntervalValue = 1 (Stunde) .. Im Idealfall sollten Sie diesen Wert in der Konfigurationsdatei festgelegt.

StartSendingMails = Funktionsname, den Sie in der Anwendung ausführen möchten.

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 erwähnt eine Konsolen-App - es gibt keinen Grund, die Windows Service-Klassen dazu zu bringen. Vor allem, wenn Sie das Problem lösen, verwenden Sie die gleiche Timer-Klasse wie die akzeptierte Antwort. – TarkaDaal

+3

Dies wird in einem Service angezeigt, gilt aber für jeden Code. NICHT zu erwähnen @TarkaDaal. Konsole wird in diesem Post nicht erwähnt. nur in dem möglichen Duplikat. –

Verwandte Themen