Methode zyklisch oder zu einer bestimmten Zeit starten



  • Hallo zusammen,

    ich versuche ein kleines Programm zu schreiben, dass eine bestimmte Aufgabe zyklisch oder zu einem bestimmten Zeitpunkt erledigen soll. Im ersten Schritt ist nur gewollt, dass das Programm z.B. um 22:00 Uhr eine Methode aufruft, die dann ein Kopiervorgang von Datenwerte in eine Oracle-DB anstößt.

    Ich habe nun auf die Timer-Klasse zurückgegriffen, die mir hierfür ja eine gute Basis bietet. Jedoch gefällt mir meine Umsetzung noch nicht so gut. Daher möchte ich euch fragen, ob ich Beispiele habt bzw. kennt, die mir eine gute Lösung demonstrieren.

    Ich habe folgendes gedankliches Problem. Wie bekomme ich ein Timer dazu, JEDEN TAG um eine gewisse Zeit die Methode aufzurufen? Ich habe es nun so, dass er einmalig zu einem bestimmten Zeitpunkt eine Methode auslöst.

    private static void TransferTimerHandler(object state)
            {
                //Execute the Transfer-Process
                //.....   
                MessageBox.Show("Timer abgelaufen!");
            }
    
            public static void RunAt(DateTime execTime)
            {
    
                // Errechnen des Unterschieds zwischen dem gewünschten Ausführungszeitpunktes
                // und der aktuellen Uhrzeit.
                TimeSpan waitTime = execTime - DateTime.Now;
    
                if (waitTime < new TimeSpan(0))
                {
                    waitTime = new TimeSpan(0);
                }
    
                // Erstellen einer neuen TimerCallback-Delegateninstanz, 
                // die eine statische TimerHandler-Methode referentiert.
                // TimerHandler wird aufgerufen, wenn der Timer abläuft.
                TimerCallback TimerCB = new TimerCallback(TransferTimerHandler);
    
                // Einen Timer erstellen, der einmal zu einem bestimmten Zeitpunkt auslöst.
                // Geben Sie -1 als Intervallwert ein, um das wiederholte Auslösen des
                // Timers zu unterbinden.
                System.Threading.Timer timer = new System.Threading.Timer(TimerCB, null, waitTime, new TimeSpan(2000));
    
            }
    

    Wenn ich nun RunAt() in meinem Programm aufrufe, so wird auch an dem zeitpunkt, den ich als Übergabeparameter festlege, die MessageBox angezeigt. Wie schaffe ich es aber, dass er nun wieder sozusagen 24h wartet und dann wieder die Methode aufruft? Ich hatte versucht über die Angabe von TimeSpan(2000) zu bestimmen, dass er schon mal alle 2 sekunden die Messagebox aufrufen soll, jedoch klappt das nicht...

    Des Weiteren ist geplant, dass man nicht nur eine feste Zeit zum Ausführen der Methode angibt sondern auch dem Timer direkt ein Interval angeben kann, nach dem der Timer dann arbeiten soll. Wie könnte man das in diese Funktionalität am schönsten einbauen??

    Vielen Dank für eure Hilfe!
    Gruß



  • Starte doch ein Timer zu beginn der Applikation, und jede Sekunde Prüft er ob die angegebene Zeit die gewünschte ist oder nicht.
    Wenn es zu trifft wird die Methode aufgerufen, wenn nicht dann passiert nichts.
    Das läuft dann so lange bis du den Timer beendest oder die Applikation schließt.

    - Applikation Start
    - Starte Timer mit 1 Sekunde Ticks (Oder gröber, falls die Genauigkeit nicht relevant ist)
    - Im Tick: Ist aktuelle Zeit die gewünschte Zeit, wenn ja: Methode ausführen



  • Hi David,

    sehr gute Idee 🙂
    Manchmal sollte man einfach nicht zu kompliziert denken 🙂

    Danke


Anmelden zum Antworten