Laden...

Anwendung Schließen

Erstellt von Ayke vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.600 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren
Anwendung Schließen

Hi

Ich habe dieses mal gleich 2 Probleme. Ich habe ein Programm geschrieben der ca 5 Threads verwendet. Nachdem ich die Form1 geschlossen habe greift ein Thread mit einen Invoke auf die nicht mehr exestierende Form1 zu. Kann ich irgenwie aus diesen Thread schauen ob die Form1 überhaupt noch ansprechbar ist ?

Auserdem wird meine Anwenung nicht geschlossen, auch nicht wenn ich über Application.Exit die Anwenung versuche zu schliessen. Ich habe überprüft ob vill ein Thread in eine endlosschleife führt aber ich habe nix gefunden. Gibt es da noch andre möglichkeiten ?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Ayke,

Appllication.Exit schließt anders als der Name vermuten lässt auch nur die Fenster und beendet Application.Run, aber damit nicht automatisch die Anwendung (genaueres in der :rtfm: Doku). Du solltest dafür sorgen, dass alle Threads mitbekommen, dass die Anwendung geschlossen werden soll und sich dann selbst beenden.

Deine Frage mit dem Invoke ist eine klassisches Synchronisierungsproblem. Das musst du selber programmieren, z.B. mit Semaphoren, Events und/oder boolschen Variablen.

herbivore

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

Ohne dich wäre ich echt aufgeschmissen xD

Vielen Dank

S
8.746 Beiträge seit 2005
vor 16 Jahren

Setze mal auf den Thread-Objekten Thread.IsBackground = true. Ansonsten mal mit dem Debugger starten und bei Ende (was ja nicht klappt) einfach Anhalten und schauen welche Threads noch laufen.

Exit, Kill & Co. zu benutzen ist in etwa so, als leert man eine Flasche indem man sich zerschlägt. Gibt wenig Fälle wo das eine gute Lösung ist (Körperteil in der Flasche geht nicht mehr raus....).

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo svenson,

hm, widersprechen sich dann deine beiden Aussagen nicht? Thread.IsBackground = true führt doch gerade dazu, dass die Prozesse gekillt werden, wenn sie am Ende noch laufen. Und wenn man dafür sorgt, dass sie das am Ende nicht mehr tun, weil sie sich brav selbst beendet habe, braucht man IsBackground nicht.

herbivore

S
8.746 Beiträge seit 2005
vor 16 Jahren

Grundsätzlich hast du natürlich recht. Auf der anderen Seite sind Thread auch was anderes als Applikationen, zumindest wenn diese interaktiv sind. So ist Application.Exit eventuell sogar eleganter als ein Close() auf dem Hauptfenster, aber hier bleiben ja auch Funktionen wie Closing-Event erhalten. Environment.Exit ist da schon eher der Holzhammer.

Zu den Threads: Kommt ganz auf darauf an. Geschätzt würde ich sagen, dass die Hälfe aller Threads (Async-Methoden noch nichtmal eingerechnet) dem klassischen Muster folgen:

Endlosschleife, Warten, Daten rausprockeln und Event aufrufen. Typischer Fall bei Netzwerk, serieller Schnittstelle, etc.! Solange keine Abräumarbeiten zu erledigen sind ist reines Abschiessen (ob explizit oder implizit) in meinen Augen (seit 2.0) legitim und einfach, zumal das Programmiermodell dahinter ja bekannt und dokumentiert ist. Diese fordert (!) sogar die Behandlung der ThreadAbortException implizit ein und erhebt damit das Abschiessen zum Regelfall.

*edit*

Ich habe noch einen interessanten Fall gefunden, der Abort() gefährlich macht: Konstruktoren. Allokieren diese Ressourcen ungesichert, führt ein Abort() darin dazu, dass auch kein Dispose aufgerufen wird - logisch, Objekt wurde ja auch nicht erzeugt. .NET schützt nur statische Klassenkonstruktoren vor Abort, nicht aber normale. Und gast alle Konstruktoren in .NET die relevant sind kümmern sich nicht um dieses Problem, sind also tendenziell anfällig.

Abort() also nur verwenden, wenn im Thread-Code keine Konstruktoren aufgerufen werden, die Ressourcen allokieren, also File I/O, etc.! Alternativ die Konstruktoren vom Hauptthread aufrufen lassen und dann übergeben.

IsBackground wiederum ist davon nur dann betroffen, wenn eine Freigabe von Nicht-Windows-Ressourcen in einem Konstruktor fehlt. Das dürfte aber ausschließlich eigener Code sein....

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

danke @ all

Ich hab das Problem gelöst. Lag an einer schleife die nicht gekillt wurde da der Thread zum killen bereits tot war. Hab einfach das Closing event verwendet um die schleife zu killen.