Autor |
Beitrag |
BlackMatrix
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Mo 26.07.10 17:50
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.07.10 21:28
Ja, so ist objektorientiertes Programmieren.
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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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);
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.07.10 22:21
Erstens: Neue Frage, neues Thema
Zweitens: Zu Diensten in C# gibt es im Internet einiges, aber um eine Schleife an sich wirst du nicht herumkommen.
www.codeproject.com/...sharpsvclesson1.aspx
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
|
|