2009-05-22 5 views
0

Ich möchte einen Stapeljob in C# schreiben, der eine Aufgabe in einem zufälligen (ish-) Intervall ausführt, z. jede Stunde +/- 20 Minuten und wenn keine Aktualisierung erforderlich ist, dann warte x2 das letzte Mal bevor es wieder läuft.So führen Sie ein Skript in zufälligen Intervallen aus

Was ist die beste Methode, dies zu tun?

Antwort

0

Sie können eine einfache Anwendung erstellen und sie mit dem Windows Taskplaner starten. Der Scheduler gibt Ihnen eine Menge Kontrolle darüber, wann und was läuft, und es beinhaltet die Zeit-Randomisierung.

EDIT: verpasste den '2x' Teil. In der Vergangenheit habe ich Windows Services gebaut, dies zu tun:

sleep(1x +/- random(20 minutes)) 
if nothing to do, sleep(2x +/- random(20 minutes)) 
0

kann nur einen Timer erstellen, die jeder so oft erscheint und läuft ein Verfahren.

Beispiel:

Timer ProcessTimer = new Timer(new TimerCallback(ProcessRandomTask), null, 0,Timeout.Infinite); 


private void ProcessRandomTask(object data) 
{ 
//Do work 

    lock(ProcessTime) 
    { 
     //change timer 
     ProcessTimer.Change(GetNewTime(), Timeout.Infinite); 
    } 
} 
1

allen anderen Antworten sind ziemlich gut, aber das einzige, was ich hier beitragen kann, ist etwas, was Sie nicht tun sollten. Do nicht machen Sie die Anwendung einen Windows-Dienst. Ich habe es schon oft als Antwort auf ähnliche Probleme gesehen. Dafür gibt es keine Windows-Dienste.

In meinem Buch, Windows-Dienste sind Anwendungen/Programme, die im Hintergrund hängen, um andere Programme zu erleichtern, oder erfordern keine Benutzereingaben zu bedienen. Es ist nicht als eine Methode zum Starten Ihres Programms in Zeitintervallen verwendet werden.

+0

Nun, Sie haben Recht, dass es kein Service sein sollte, es sei denn, notwendig. Dienste sind eine großartige Möglichkeit, sicherzustellen, dass etwas * immer * ausgeführt wird, auch wenn der Benutzer abgemeldet ist oder ein Computer neu gestartet wurde. Es klingt, als könnte er das wollen. –

+0

Wenn das die Funktionalität ist, die er will, dann ignoriert er meine Antwort trotzdem. Aber es ist nur ein Juckreiz, den ich in der Öffentlichkeit kratzen wollte. –

+0

Ich freue mich zu sehen, dass es Echo auf dem Bildschirm Fortschritt, nur damit wir es arbeiten sagen können. So vermeiden Sie, einen Dienst zu schreiben. – Pbearne

0

Wie wäre es mit der Protokollierung des Zeitstempels vom letzten "unnötigen" Lauf zu einer Datenbank/einem festen Standort? Dann kann Ihre erste Zeile sagen:

LastRunWithoutUpdating = GetLastRunWithoutUpdating() // load from file, or db... 
if (LastRunWithoutUpdating - CurrentTime < DelayInterval) { 
    SkipThisRun(); // sys.exit() or something 
} 
+0

wurde versucht, keine db zu verwenden – Pbearne

+0

Wenn Ihr Programm nicht auf den Scheduler zugreifen kann, müssen Sie entweder über eine Art persistenten Speicher verfügen oder der Prozess muss seine eigene Planung durchführen (d. H. Bleiben und schlafen). Also, wie wäre es mit dem "letzten Update" Wert in eine Datei schreiben? – ojrac

+0

möglich, es kann ein paar andere Werte geben, die ich speichern muss – Pbearne