Laden...

Prüfen, ob Thread von System.Timers.ElapsedEventHandler noch läuft

Erstellt von steschu vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.779 Views
steschu Themenstarter:in
24 Beiträge seit 2009
vor 12 Jahren
Prüfen, ob Thread von System.Timers.ElapsedEventHandler noch läuft

Hallo,

Der System.Timers.Timer ElapsedEventHandler wird ja automatisch in einem eigenen Thread gestartet.

Ich benutze die System.Timers.Timer Klasse in einem Windows Service und möchte nun in der OnStop()-Methode des Windows Service checken, ob der Thread des ElapsedEventHandler noch läuft und das Stoppen des Service so lange hinauszögern bis der Thread beendet ist. Ungefähr so:

protected override void OnStop()
{
  while(<Thread des EventHandlers>.IsAlive)
  {
    Thread.Sleep(1000);
  }

  base.OnStop();
}

Ich prüfe also alle Sekunde, ob der Thread noch läuft, nur wie bekomme ich aber Zugriff auf den Thread des EventHandlers?

Viele Grüße,
Stephan

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo steschu,

so eine while-Alive-Schleife ist suboptimal und üblicherweise gar nicht nötig. Du musst auch gar nicht wissen, in welchem Thread die Aktion läuft. Du willst nur warten, bis sie fertig ist. Dann tue genau das. Das geht mit einem Manual/AutoResetEvent eigentlich auch ganz einfach. Siehe Consolenanwendung mit Timer optimieren [Semaphore/Ampel].

Blöd ist nur, dass man nicht weiß, ob der ElapsedEventHandler gerade gestartet wurde, aber die erste Anweisung noch nicht ausgeführt wurde. Ich sehe nicht, wie man diesen Fall abfangen könnte.

Deshalb würde ich einen System.Windows.Forms Timer verwenden. Da sind die Ticks immer synchron zu dem Thread, der der das Stop macht. Das heißt, da weiß man, wenn Stop, dann Stop. Innerhalb des Tick-EventHandlers kannst du die Ausführung immer noch in einen extra Thread verlagern. Aber du hast eben einen Punkt, an dem du die Ampel auf Rot setzen kannst, bevor der Thread anfängt zu arbeiten. Der Thread kann die Ampel am Ende wieder auf grün setzen.

Nur für den Fall: Innerhalb des GUI-Threads darfst du natürlich nicht warten. Siehe [FAQ] Warum blockiert mein GUI?

EDIT: Du bist in einem Service, oder? Dann ist Windows Forms keine Alternative ==> ausgegraut.

herbivore