Laden...

Sicherstellen, dass Timer-Eventhandler nicht gestartet wird, wenn der vorige noch läuft

Erstellt von Kostas vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.447 Views
K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 12 Jahren
Sicherstellen, dass Timer-Eventhandler nicht gestartet wird, wenn der vorige noch läuft

Hallo Zusammen,

ich habe auf der Form einen Timer welcher periodisch
diesen Thread erzeugt. Normalerweise ist der Thread fertig bevor
der Timer erneu zuschlägt. Theoretisch ist es jedoch möglich dass der Thread
immer noch läuft. Deshalb würde ich gerne abfragen
ob der Thread immer noch läuft. Wenn ja, soll der Timer
einfach eine Periode auslassen.

 Thread newThread =
            new Thread(new ThreadStart(CheckEmails));
            newThread.Start();

Hat jemand eine Idee?

Gruß Kostas

107 Beiträge seit 2011
vor 12 Jahren

Hier bieten sich die Properties ThreadState oder IsAlive an.

q.e.d.

5.742 Beiträge seit 2007
vor 12 Jahren

Hallo Kostas,

deine jetzige Variante ist eher suboptimal:

Halten den Timer besser an, wenn du den Thread startest und starte ihn erneut, wenn er fertig ist.
Evtl. musst du dann allerdings mit dem Interval aufpassen und dieses u.U. entsprechend anpassen, wenn du das neue Verhalten nicht willst.

Andernfalls kannst du auch einfach eine volatile Varible verwenden, in der du dir merkst, ob der Thread gerade läuft.

Zudem würde ich den Threadpool verwenden, statt jedes Mal einen neuen Thread zu erzeugen (spart Resourcen!).

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Kostas,

neben den von ProgrammierTroll genannten Eigenschaften kommt es darauf was du mit den Emails dann machen willst. Ev. bietet sich hierzu die SyncQueue <T> - Eine praktische Job-Queue bzw. allgemein eine Pipeline (Producer/Consumer) an und der Timer "weckt" den Producer-Thread.

Zudem würde ich den Threadpool verwenden, statt jedes Mal einen neuen Thread zu erzeugen

Beim Herunterladen von Emails könnte es auch andersrum sein, denn (v.a. wenn Anhänge dabei sind) ist das eine relativ lange dauernde Aktion und wenn sonst noch Threads benötigt würden, dann wäre es besser einen direkt zu erstellen bzw. bei Tasks mit LongRunning diese zu erstellen. Exaktes kann hier aber nur eine Messung bzw. Profiling zeigen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 12 Jahren

Hallo Zusammen,

ich habe es jetzt üben die Klasse BackgroundWorker gemacht.
Der Timer stoppt sich selbst und startet danach den WorkerThread
per RunWorkerAsync();
Wenn der event RunWorkerCompleted gefeuert wird, wird der
der Timer wieder gestartet.

Die Implementierung war für mich am einfachsten und es scheint soweit
zu funktionieren. Zumindest habe ich beim Testen es nicht geschafft die
Implementierung ins schwanken zu bringen.

Dankeschön für die Hilfestellung.

Gruß Kostas