PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [.NET] Zeitgesteuerte Codeausführung


Gast
2010-03-24, 12:46:26
Hi ich will mit .NET die Ausführung von Code innerhalb eines Programm zeitsteuern.

So soll z.B. ein Programm, das im Hintergrund läuft um 12:46 jeden Mittwoch einen bestimmten Code ausführen usw. Wie der Taskplaner oder ein cron eben. Wie macht man das?

Eigentlich wollte ich ein Programm mitlaufen lassen, d.h. wenn man es beendet wird auch nichts mehr zeitgesteuert ausgeführt. Ist es hier evtl sinnvoll einen Dienst zu verwenden, der im Hintergrund mitläuft?

mfg

Gnafoo
2010-03-24, 13:26:41
Ich würde sagen: nimm entweder einen Timer, der einfach regelmäßig feuert und prüfe dann jeweils, ob das nächste Event auszuführen ist oder benutze selbst den Windows Scheduler dafür. Es kann aber sein, dass letzteres nur über die Win-API funktioniert. Bei dem Timer kann man das Intervall für die nächste Rückmeldung ggf. auch direkt vom nächsten Event abhängig machen.

In .NET stehen dir mehrere Timer zur Verfügung: bei System.Timers.Timer und System.Threading.Timer musst du allerdings etwas aufpassen, weil die Handler-Methode in einem anderen Thread aufgerufen wird. Für System.Windows.Forms brauchst du Windows.Forms und vermutlich auch ein Fenster (also für den Service nur eingeschränkt geeignet). Bei WPF gibt es noch den System.Windows.Threading.DispatcherTimer, der ähnlich wie der Windows-Forms-Timer funktioniert.

Hier steht auch ein bisschen was dazu:
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

Was den Service angeht: kann man natürlich machen, ob das sinnvoll ist, hängt vom Anwendungsfall ab. Ein Service braucht Admin-Rechte zur Installation und läuft normalerweise auch immer. Wenn du eine Interaktion mit der GUI brauchst, kommt noch das Problem dazu, dass beide Prozesse miteinander kommunizieren müssen.

PatkIllA
2010-03-24, 13:41:14
Beim Taskplaner hat man noch den Vorteil, dass der sogar den Rechner aufwecken kann und es auch ausgeführt wird, wenn der Rechner neugestartet wird oder in den Standby war.

Du kannst auch einen Thread anlegen und den solange schlafen legen bis wieder ein Event fällig ist.

Gast
2010-03-30, 00:17:39
1.) Ob der Rechner auch wirklich aus dem Standby aufwacht ist so ein Sache. Verlassen würde ich mich darauf nicht. Für Wichtigere Dinge würde ich den Rechner laufen lassen

2.) Ich würde auch den Taskplaner nehmen, da der für genau solche Sachen gemacht ist.

3.) Wenn du manuell warten willst, dann lässt sich das einfach mit der Funktion System.Threading.Thread.Sleep lösen. Da muss man nicht sinnlos im Hintergrund einen Timer laufen lassen.

Dim Jetzt = DateTime.Now
Dim Geplant = DateTime.Parse("1.2.2010 8:15:00")
dim Duration = (Geplant.Ticks-Jetzt.Ticks)/10000
Thread.Sleep(Duration)

Das Ganze sollte man jedoch nicht im Hauptthread machen, weil sonst friert die ganze Geschichte ein.