Entwickler-Ecke

Sonstiges (.NET) - Event/Nachricht wenn ein Thread beendet ist


Ares - Mi 12.01.11 16:52
Titel: Event/Nachricht wenn ein Thread beendet ist
Hallo!

In Ergänzung zu meiner vorherigen Fragen [http://www.c-sharp-forum.de/topic_Thread+steuern+pausieren+fortsetzten++Was+beachten_103493.html] über die Kontrolle eines Arbeitsthreads habe ich noch folgendes Problem:

Der Hauptthread startet einen Arbeitsthread und arbeitet weiter während dieser seine Aufgabe erledigt. Wie kann nun der Hauptthread über das Ende des Arbeitsthreads informiert werden?

Wie gesagt soll der Hauptthread weiterarbeiten während der Arbeitsthread seine Aufgabe erledigt. Der Hauptthread kann also nicht aktiv auf das Ende des Arbeitsthread warten indem er z.B. ein einer While-Schleife den ThreadStatus überprüft und wartet bis dieser nicht mehr Running ist.

Der Arbeitsthread kann auch kein Eventauslösen, weil die Bearbeitung des Events dann ja immer noch im Arbeitsthread stattfinden würde.

Die Einzige Möglichkeit die mir eingefallen ist, wäre die Verwendung eines Timers im Hauptthread. Dieser überprüft in regelmäßigen Abständen den Arbeitsthread während der Hauptthread ansonsten weiterarbeitet. Dabei bin ich mir aber gar nicht sicher, ob der Timer überhaupt anspringt solange der Hauptthread noch aktiv andere Aufgaben durchführt.

Wie löst man diese Aufgabe also korrekt?

Besten Dank
Ares


Klabautermann - Mi 12.01.11 17:35

Hallo,

korrekt ist jede Lösung die Funktioniert, nur Elegant ist sie nicht immer ;).

Ich würde das über eine CallBack-Methode lösen. Also eine Methode des Hauptthreads, welche per synchronize aus dem Arbeitsthread aufgerufen wird, bevor dieser sich beendet.

Gruß
Klabautermann


Ares - Mi 12.01.11 17:49

Hallo!

Vielen Dank für die Antwort. Ein CallBack ist ja quasi ein Event. Hierbei ist dann wie gesagt das Problem, dass dieses vom Arbeitsthread ausgeführt wird und nicht im Hauptthread.

Du hast gesagt, dass der Aufruf per synchronize erfolgen sollte. Ich denke, dass dies das Problem löst, allerdings habe ich hierzu nichts gefunden. Wie genau erfolgt so ein Aufruf per synchronize? Wo ist synchronise implementiert?


jaenicke - Mi 12.01.11 17:52

Hier geht es ja um .NET, oder? Was benutzt du denn? Einen Backgroundworker? Da gibt es doch auch RunWorkerCompleted oder so als Event, oder?

Jedenfalls muss der Zugriff mit dem Hauptthread einfach nur synchronisiert werden. Soweit ich mich entsinne reicht da ein delegate.


Ares - Mi 12.01.11 21:38

Nein, einen Backgroundworker verwende ich (noch) nicht. Ich habe noch nicht viel Erfahrung mit der Verwendung von Threads. Ich habe also einfach ein Thread-Objekt erstellt und dieses gestartet...

Wegen der mangelnden Erfahrung weiß ich auch nicht wie icb "einfach den Zugriff mit dem Hauptthread synchronisiere". Hast du hierzu noch einen Tipp in welche Richtung ich hier suchen muss?


Th69 - Mi 12.01.11 22:01

Hallo Ares,

evtl. hilft dir folgende Komponente dabei CrossThread Calls [http://www.mycsharp.de/wbb2/thread.php?threadid=60605]?