Ausgeführte Methode jede Stunde auf der Stunde
Möchte ich ausführen einer Methode, die jede Stunde auf der Stunde. Ich schrieb einige code,aber es ist nicht genug für mein Ziel. Code unten ist arbeiten alle 60 Minuten.
public void Start()
{
System.Threading.Timer timerTemaUserBilgileri = new System.Threading.Timer(new System.Threading.TimerCallback(RunTakip), null, tmrTemaUserBilgileri, 0);
}
public void RunTakip(object temauserID)
{
try
{
string objID = "6143566557387";
EssentialMethod(objID);
TimeSpan span = DateTime.Now.Subtract(lastRunTime);
if (span.Minutes > 60)
{
tmrTemaUserBilgileri = 1 * 1000;
timerTemaUserBilgileri.Change(tmrTemaUserBilgileri, 0);
}
else
{
tmrTemaUserBilgileri = (60 - span.Minutes) * 60 * 1000;
timerTemaUserBilgileri.Change(tmrTemaUserBilgileri, 0);
}
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
}
catch (Exception ex)
{
timerTemaUserBilgileri.Change(30 * 60 * 1000, 0);
Utils.LogYaz(ex.Message.ToString());
}
}
public void EssentialMethod(objec obj)
{
//some code
lastRunTime = DateTime.Now;
//send lastruntime to sql
}
- Verwenden
DateTime
statt? Sie können nicht erwarten, dass Ihre timer tick genau auf die Stunde, jede Stunde - nur einen timer, der überprüft den aktuellenDateTime
statt. Halten Sie die aktuelle Uhrzeit in eine variable, wenn der timer "tickt", um zu sehen, wenn die Stunde verändert hat - wenn ja, update die aktuelle Stunde-variable und führen Sie Ihre Aufgabe - Warum nimmst du nicht den timer aus der Gleichung heraus und nur mit der Windows-Aufgabenplanung statt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, dass Ihr code ausgeführt werden kann alle 60 Minuten:
wenn Sie wollen, dass Ihr code ausgeführt werden jede Stunde (d.h. 1:00, 2:00, 3:00) Sie können eine timer-mit einigen kleinen Intervall (sagen wir eine Sekunde, hängt von der Präzision, die Sie brauchen) und innerhalb dieses timer-Ereignis prüfen, ob eine Stunde vergangen ist
Nur ein kleiner Kommentar basiert auf /Anarion die Lösung, dass ich nicht fit in einen Kommentar.
Brauchen Sie es nicht zu gehen, mit aller Genauigkeit, bei allem, denken Sie "wie überprüfe ich diese Stunde ist die Stunde, ich will Feuer". Sie könnten alternativ denken, "Wie kann ich überprüfen Sie die nächste Stunde möchte ich, um das Feuer" - wenn Sie denken, dass Sie wie realisieren Sie brauchen keine Präzision bei allen, markieren Sie einfach einmal eine Stunde, und legen Sie einen thread für die nächste Stunde. Wenn Sie die Zecke einmal einer Stunde werden Sie wissen, Sie werden irgendwann vor der nächsten Stunde.
Stimme ich mit Señor Salz, dass die chron-job sollte die erste Wahl sein. Aber der OP fragte, für jede Stunde auf der Stunde von c#. Zu tun, dass ich das erste zeitgesteuerte Ereignis, um Feuer auf die Stunde:
Das problem ist jetzt, dass, wenn die oben genannten timer.Intervall passiert, werden 45 Minuten und 32 Sekunden, dann wird der timer weiterhin brennen alle 45:32 nicht nur beim ersten mal. So, innerhalb der timer_Tick-Methode, müssen Sie stellen Sie den timer.Intervall auf eine Stunde.
Verwenden Sie einen Cron-Job auf dem server zum Aufruf einer Funktion im angegebenen Intervall
Heres ein link
http://www.thesitewizard.com/general/set-cron-job.shtml
Wie über etwas einfacheres? Verwenden Sie eine ein-Minuten-timer zum überprüfen der Stunde:
Was zu versuchen den code unten, wird die Schleife bestimmt ist, speichern Sie Ihre Ressourcen, und es wird ausgeführt jede GENAUE Stunde, also mit beiden die Minuten und die Sekunden (und fast Millisekunden gleich null:
Warum ist jeder Versuch, dieses problem zu behandeln, mit einem timer?
tust du zwei Dinge... warten, bis die Spitze des Stunden-und dann läuft dein timer jede Stunde auf der Stunde.
Ich habe einen windows-Dienst dort, wo ich diese gleiche Lösung. Ich habe meinen code in einer sehr ausführlichen Art und Weise, so dass es leicht zu Folgen für jedermann. Ich weiß, es gibt viele Abkürzungen, die implementiert werden können, aber das überlasse ich Euch.
Hier ist eine einfache, stabile (self-Synchronisation) Lösung:
Beachten Sie, dass Iterationen kann übersprungen werden, wenn
DoStuff()
länger als eine Stunde dauert, um Sie auszuführen.var previousTrigger = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute - now.Minute % 10, 0, now.Kind);
var nextTrigger = previousTrigger + TimeSpan.FromMinutes(10);