Laden...

System.Timers.Timer immer neustarten?

Erstellt von miketech vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.056 Views
M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren
System.Timers.Timer immer neustarten?

Hi zusammen,

ich habe in meinem Programm eine System.Timers.Timer, welcher alle X Millisekunden ein Event auslöst. Das funktioniert auch immer ganz gut, aber nach einer Zeit scheint er kein Event mehr auszulösen. Ich finde hierfür auch kein Muster. Ich hab eine Multithreading - Anwendung und habe schon überlegt, ob hier irgendwo ein Fehler auftritt und sich vielleicht der Timer - Thread verabschiedet. Aber jetzt ist mir noch eine andere Idee gekommen:

Wenn ein Timer ein Event wirft, weil die Zeit abgelaufen ist, muss ich dann den Timer wieder neu mit Start() starten? Oder macht er das immer automatisch? Im Moment macht er es zwar automatisch, aber hört nach einiger Zeit wohl damit auf.

Oder hat jemand irgendeine Idee, woran das liegen kann?

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

vielleicht wird der Timer vom CG entsorgt. Probier mal GC.KeepAlive.

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Hi,

ok also muss ich den Timer wohl nicht neustarten, danke 🙂 Das komische ist:

Also ich habe definitiv eine Referenz auf den Timer. Also zumindest auf die Klasse, wo der Timer steckt und diese hat eine private Variable mit dem Timer. Somit dürfte der GC die ja nicht wegräumen, oder?

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

dass eine Referenz existiert, heißt nicht, dass das Objekt auf jeden Fall am Leben bleibt. Siehe Speicheradresse adressof() ausgeben. Warum probierst du es nicht einfach?

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Hi,

klar bin schon dabei. Ich versuch nur auch ein bisserl den Background davon zu verstehen, danke.

Gruß

Mike

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Was mir auch grad noch einfällt: Wenn ich myTimer.Stop() aufrufe und myTimer.Start() führt das aber zu keinem Fehler und der Timer läuft wieder. Kann das sein? Wenn der GC myTimer gelöscht hätte müsste das doch zu einem Fehler führen, oder?

Es ist tatsächlich so, dass sich in meinem Programm aber Zyklen befinden. Also A referenziert B und umgekehrt. Hier darf keines der Objekte jemals gelöscht werden. Vielleicht erklärt das die mysteriösen Fehler, die ich zur Zeit bekomme. Setz ich GC.KeepAlive dann jeweils in den Destruktor der Objekte? Also in A ein KeepAlive(b) in den Destruktor von A und genauso umgekehrt?

Gruß

Mike