Entwickler-Ecke
Sonstiges (.NET) - Realisierung einer Aufgabe aller x Minuten
BlackMatrix - Mo 26.07.10 17:50
Titel: Realisierung einer Aufgabe aller x Minuten
Hi.
Ich habe heute Morgen schon etwa 3 Stunden gewerkelt und ich bin einfach nicht auf die Lösung gekommen.
Ich habe 3 URLs, bei denen ich alle 30, 45 oder 60 Minuten einen Aufruf durchführen möchte. Bei allen URLs soll das gleiche ausgeführt werden.
Die für mich einfachste Möglichkeit ist, 3 Threads zu starten und einfach mit Thread.Sleep zu warten. Das würde funktionieren, aber ich möchte gerne Timer einbinden, die ja scheinbar auch die beste Möglichkeit dafür bieten.
Also habe ich mir eine Klasse geschrieben mit der Methode "Start" in der erst etwas ausgeführt wird und dann der Timer gestartet werden soll.
Dann habe ich in meiner Main ein(!) Objekt der Klasse erzeugt und lasse nun jede Seite mit diesem Objekt die "Start" Methode aufrufen.
Wenn dass so OO-mäßig korrekt implementiert ist, wie erreiche ich nun, dass wenn die einzelnen Timer der Seiten abgelaufen sind, dass mein Programm weiß bei welcher Seite es jetzt den Aufruf tätigen soll?
Ich habe folgendes in meiner Startmethode:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| [...] Timer timer = new Timer(); timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); timer.Interval = wartezeit; timer.Enabled = true; }
void OnTimedEvent(object source, EventArgs e) { aufruf(url); } |
Und jetzt hab ich halt das Problem, dass mein Timer, wenn er startet, nicht weiß welche URL das ausgelöst hat.
Ich habe mich nun schon belesen in Events und habe Video2Brain und GalileoComputing angeschaut, irgendwie verstehe ich es nicht.
MfG
Ralf Jansen - Mo 26.07.10 18:24
Ähm, du hast 3 Timer mit 3 Events für 3 URI's. Da sollte jeden Timerevent einfach die passende URI hart zuweisbar sein.
Für einen solch ~seltenen~ Aufruf der Timerfunktion wäre es vielleicht geschickter eine simple Konsolenanwendung zu schreiben die die URI in den Kommandozeilenoptionen übergeben bekommt. Und deren regelmäßiger Aufruf wird dann einfach als geplanter Task in Windows hinterlegt. Dann besteht kein Bedarf die Anwendung ständig im Hintergrund laufen zu haben nur weil die alle Jubeljahre mal was anstellt.
BlackMatrix - Mo 26.07.10 18:44
Aber wenn ich die Timer hart codiere, kann ich ja im nachhinein nicht ohne weiteres eine weitere URL hinzufügen, sondern müsste noch einen Timer einbauen. Ich will eigentlich schon, dass ich am Ende nur die 3,4,5 URLs da eintrage und das Programm selbstständig weiß, was es zu tun hat.
Über den geplanten Task habe ich auch schon drüber nachgedacht, aber ich will ja, dass die einzelnen Seiten zu unterschiedlichen Zeiten aufgerufen werden und nicht das das ganze Programm alle x Minuten ausgeführt wird.
Kha - Mo 26.07.10 19:10
Du erstellst von deiner Klasse so viele Instanzen wie URLs und übergibst jeder dann die URL und das zugehörige Intervall.
BlackMatrix - Mo 26.07.10 21:26
oh Gott, es kann so einfach sein xD Danke
Und wo ist jetzt genau der Unterschied zwischen
C#-Quelltext
1:
| System.Timers.Timer timer = new System.Timers.Timer(10000); |
und
C#-Quelltext
1: 2:
| System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 10000; |
Hab das in der MSDN nicht richtig verstanden.
jaenicke - Mo 26.07.10 21:28
Ja, so ist objektorientiertes Programmieren. :D
Alles in Klassen packen und delegieren bis nix mehr zum Delegieren übrig ist. ;-)
Der Unterschied ist, dass du im zweiten Fall den Wert erst nach dem Erzeugen setzt. Da ist kein wichtiger Unterschied dabei.
BlackMatrix - Mo 26.07.10 21:46
Kann mir noch jemand besseren Code für das nicht verlassen der Main geben bei einem Windows Dienst geben?
while (true) System.Threading.Thread.Sleep(1000000);
BlackMatrix - Di 27.07.10 15:38
Ab wann ist es denn sinnvoller einen System.Timer anstelle eines Thread.Sleep zu verwenden?
C#-Quelltext
1: 2: 3: 4: 5:
| while(true) { [...] Thread.Sleep(x); } |
oder eben selbiges mit Timer.
jaenicke - Di 27.07.10 19:12
Das sind zwei Paar Schuhe, ein Timer führt periodisch etwas aus, Sleep wartet eine bestimmte Zeit.
Ein Timer kann dementsprechend nicht dafür sorgen, dass deine aktuelle Schleife weiterläuft. Denn der Timer wird bei Beendigung des Programms schlicht mit beendet.
BlackMatrix - Di 27.07.10 21:14
Ich meinte dass auch in Verbindung meiner Realisierung von oben.
Ich könnte ja auch eine periodische Ausführung durch eine while(true) Schleife realisieren und dann immer das ausführen, was ich im Falle eines Timers im Elapsed Event ausführen würde.
Und da wollte ich eben wissen, ob es irgendwelche Richtlinien/Empfehlungen gibt, das eine oder das andere zu benutzen.
jaenicke - Mi 28.07.10 06:08
Grundsätzlich sollte man so wenig wie möglich schleifenbasiertes Polling nutzen, da Windows ereignisorientiert ist. Also grundsätzlich eher Timer als Schleife wo das geht.
Hier kommst du um die Schleife wohl nicht herum (keine Ahnung, hab nicht nach Alternativen gesucht), daher kannst du dann auch gleich deine Aktion darin machen statt im Timer. Denn der würde während eines Sleep ja ohnehin nicht durchlaufen werden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!