In schließendem Form auf Thread warten.
-
Wenn ein Form-Fenster durch einen Klick geschlossen wird, soll ein Thread beendet werden. Das Form-Fenster soll sich erst dann schließen, wenn der Thread beendet ist, weil der Thread auf Steuerelemente der Form zugreift.
Wäre der richtige Ort, den Thread zu beenden das Ereignis FormClosing?
Wie lässt sich sowas sauber lösen?
-
Ich hoffe der Thread, der auf die Steuerelemente zugreift ist derjenige, der das Fenster erstellt hat oder es wird Invoke(..) verwendet.
Simon
-
Q & D
erstmal Hide() ... und wenn der Thread fertig ist, dann Close()
-
theta schrieb:
Ich hoffe der Thread, der auf die Steuerelemente zugreift ist derjenige, der das Fenster erstellt hat oder es wird Invoke(..) verwendet.
Simon
ja
mogel schrieb:
Q & D
erstmal Hide() ... und wenn der Thread fertig ist, dann Close()
das hört sich irgendwie gemogelt an :p
-
Warte doch einfach dort, wo du die Form schließt, darauf, dass der Thread fertig ist? Du kannst in der Zwischenzeit ja ein "Bitte warten" oder sowas einblenden
-
Mit Join kannst du auf das Ende eines Threads warten. Falls das länger dauert, kannst du ja auch nen Balken durchlaufen lassen
Falls du noch mehr Hilfe brauchst, es gibt relativ viele Artikel wenn du nach c# thread beenden suchst.
-
F(th)re(a)d schrieb:
mogel schrieb:
Q & D
erstmal Hide() ... und wenn der Thread fertig ist, dann Close()
das hört sich irgendwie gemogelt an :p
Mag sein, aber für den User oft sehr sinnvoll. Der erwartet sofortige Reaktionen und nicht irgendwelche Hänger. Auch Ladebalken gerade beim Schliessen werden oft als etwas sehr negatives empfunden.
Ein Programm braucht aber nunmal manchmal einfach etwas Zeit zum sich beenden. Das ist meistens nicht sehr lange, aber halt doch zu lange für den Benutzer. Daher versteckt man einfach das Fenster oder schliesst es und führt erst dann noch die Aufräumarbeiten durch.
Typisches Beispiel, wo dies nicht passiert, ist Visual Studio. Wenn du da auf das X klickst, dauert es mehrere Sekunden, bis sich das Fenster schliesst. Empfinde ich persönlich als sehr mühsam und wäre auch nicht nötig.Falls es nicht darum geht, dass sich das Programm beendet, du also nur Daten verarbeitest, dann müsste man sich überlegen was man genau macht. Ich würde wahrscheinlich im FormClosing zuerst ein
Thread.Join(int)
aufrufen für ca. 200ms. Falls der Thread sich bis dahin immer noch nicht beendet hat, würde ich den Schliessvorgang abbrechen, das Fenster perHide
verstecken und einen Wartebalken präsentieren. Dann wieder mitThread.join(int)
warten mit einer Sicherheitszeit. Sobald der Thread beendet wurde, den Wartebalken entfernen und auch das andere Fenster schliessen. Falls die Sicherheitszeit überschritten wird, hast du einen fatalen Fehler und kannst noch irgendwie darauf reagieren. Der User hat somit dann nicht einen ewigen Wartebalken und muss das Programm abwürgenGrüssli
-
168461349878 schrieb:
Warte doch einfach dort, wo du die Form schließt, darauf, dass der Thread fertig ist? Du kannst in der Zwischenzeit ja ein "Bitte warten" oder sowas einblenden
ja, aber in der zeit blockiert das fenster. das macht auch keinen guen eindruck.
beselbube schrieb:
Mit Join kannst du auf das Ende eines Threads warten. Falls das länger dauert, kannst du ja auch nen Balken durchlaufen lassen
Falls du noch mehr Hilfe brauchst, es gibt relativ viele Artikel wenn du nach c# thread beenden suchst.
ein join würde auch das fenster blockieren, glaub ich.
ich habe einen thread erstellt der den zu beendenden therad beendet
jetzt blockiert das fenster nicht.
das mit dem verstecken ist ne sehr gute idee ( auch wenn ein wenig geschumelt )danke für die antworten (@dravere danke für die bestätigung!
)!ich werd noch etwas testen :p
-
ich kapier das nicht, das form-fenster schließt, aber der thread beendet nicht
obwohl die thread loop durchgelaufen ist
was könnte das sein?
-
hab die codezeile gefunden, ist irgendwas mit ManualResetEvent. wenn ich das wegkommentiere gehts, .. aber wiso weiss ich noch nicht. ich bleibe am ball..
-
Mit so wenig Infos können wir dir auch nicht weiterhelfen
Grüssli