Eigentlich sollte ein Thread beendet werden, nachdem alle Befehle in der Threadmethode abgearbeitet wurden. Trotzdem habe ich eine while(x.IsAlive) Abfrage, die leider gegen unendlich geht. Warum wird IsAlive nicht auf "false" gesetzt?
Hallo Sera,
mehr Kontext bitte. Wer startet wen, wer macht was?
Btw.: Folgendes läuft einwandfrei (nach 5 sec) ohne Endlosschleife durch.
Thread thread = new Thread(() => { Thread.Sleep(5000); });
thread.Start();
while (thread.IsAlive)
;
Gruß,
dN!3L
P.S.: while(x.IsAlive) ist eine ganz schlechte Idee. Dafür gibt's doch extra Synchronisierungsobjekte!
hi dn,
Hab es getestet, ja das geht. Ich hatte ein Event gestartet und auf die Mainform delegiert. Das war der Grund. Muss ich unbedingt die Main Form invoken um das zu umgehen? Main Thread != DLL Thread.
Ich hatte ein Event gestartet und auf die Mainform delegiert. Das war der Grund. Muss ich unbedingt die Main Form invoken um das zu umgehen? Main Thread != DLL Thread.
Häh? Ein bisschen mehr Text könnte schon sein. Meine USB-Glaskugel ist gerade kaputt...
Die Threadmethode hat einen Eventdistributor inkludiert, der das Event "Ich bin fertig" an seine Subscriber liefert.
Ein Subscriber ist die Mainform selbst, wo ich ein Label in dieser Methode fülle. Ich habe den Eventteil gelöscht und nun funktioniert die IsAlive Abfrage.
Ein Subscriber ist die Mainform selbst, wo ich ein Label in dieser Methode fülle. Ich habe den Eventteil gelöscht und nun funktioniert die IsAlive Abfrage.
Hm, also eine detaillierte Beschreibung ist das immer noch nicht...
Versuchen sich irgendwelche Eventhandler mit dem Hauptthread zu synchronisieren (Control.Invoke)? Die laufen erst durch, wenn der Hauptthread Zeit dafür hat. Und die hat er nicht, weil er in while (thread.IsActive) steckt (wie gesagt, ganz blöde Idee. Schonmal nach Mutex/Semaphoren oder BackgroundWorker geguckt?). Also ein schöner Lifelock.
Gruß,
dN!3L
ok, ist mir auch noch nicht geholfen.
Stimmt immer noch etwas nicht.
Threadmethode
Eventhandler
Subscriber des Events
Thread delegiert "Ich bin fertig" an subscriber.
Mainform registriert, daß Thread ein Event geschickt hat. Nun will ich das Label innerhalb der Eventmethode aktualisieren. Stillstand! Endlosschleife -> IsAlive = true
Ich muss also das Label per Invoke füllen?
Dreimal habe ich es gesagt, langsam reicht's.
Mehr Kontext bitte! Wer macht wann was?
Rumgerate bringt nichts. Code schon eher.
Wofür Code? Ich hab ein Crossthreading Problem. Ein Thread soll ein Control meines MainThreads modifizieren. Sieht nach Async Probs aus.
Will nicht offensiv wirken, dn, aber dennoch danke für deine Hilfe.
Ich hab ein Crossthreading Problem. [...] Sieht nach Async Probs aus.
Und genau das ist das Problem. Du rätst irgendwas, und wir können hier noch viel weniger helfen, da wir wenige bis gar keine Infos haben, was du da programmiert hast.
Klar könnte man mehrere Dinge raten, an denen es liegt, aber bringt ja nichts (für dich).
Ein Thread soll ein Control meines MainThreads modifizieren.
Controls kann einzig und allein der Hauptthread (der, der sie auch erstellt hat) modifizieren. Aus anderen Threads muss man über Invoke gehen. Aber sowas führt nicht zu Lifelocks, sondern zu Exceptions. Aber das ist auch alles nur Gerate ohne handfeste Informationen.
Gruß,
dN!3L
Klar, dn. Nur ist es nicht mein Code, Events werden aus fremden Threads gestartet und der Progger denkt das geht. Wäre eine Idee gewesen und ich in meiner Motivation eine Background Worker Geschichte hingepfuscht, da diese gerade so schön reinpasst.