+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Absturz .net-Anwendung


(Guest) #1

Hallo,

ich hatte mal wieder ein Problem, das ich erst nach einigem Ausprobieren los wurde. Ich poste es hier mal - vielleicht hilft es dem einen oder anderen…

Meine .net-LL-Anwendung sürzte immer mal wieder an - mit Vorliebe, wenn ich zwischen diesem Programm und einer anderen Anwendung mit dem Taskmanager wechselte. Der Verdacht lag nahe, dass der Garbage-Collector, der beim Taskwechsel allen möglichen Speicher freischaufelt, beteiligt ist. Und da das Programm nur dann crashte, wenn irgendwie LL benutzt wurde, habe ich in dieser Richtung gesucht - mit folgenden Ergebnis: Mehr als eine “nicht-dispose-te” LL-Instanz führt zum Absturz beim Programmwechsel.

Falls der Scope der ersten Instanz schon so lange “verlassen” ist, dass die Instanz bereits aus dem Speicher entfernt wurde läuft alles wie gewünscht aber wenn zwei LL-Instanzen “gleichzeitig” vom Garbage Collector gelöscht werden, dann kommt es zu einer Speicherschutz-Verletzung.

Das Problem kann man umgehen, in dem man entweder zwischen zwei Ausdrucken ein bischen wartet und in der Anwendung rumklickert (nicht ganz ernst gemeint) oder von JEDER LL-Instanz am Ende des Scopes Dispose aufruft - das ist natürlich vor allem dann ungewohnt, wenn man seine Instanzen mit dem Formdesigner erzeugt, denn dann kümmert man sich um sowas wie Dispose ja eher nicht. Also besser mit new erzeugen und kontrolliert Dispose() aufrufen - dann klappts auch mit dem Nachbar-Prozess.


(Guest) #2

Kai Hinkelmann schrieb:

Hallo,

Meine .net-LL-Anwendung sürzte immer mal wieder an - mit Vorliebe,
wenn ich zwischen diesem Programm und einer anderen Anwendung mit dem
Taskmanager wechselte. Der Verdacht lag nahe, dass der
Garbage-Collector, der beim Taskwechsel allen möglichen Speicher
freischaufelt, beteiligt ist. Und da das Programm nur dann crashte, wenn
irgendwie LL benutzt wurde, habe ich in dieser Richtung gesucht - mit
folgenden Ergebnis: Mehr als eine “nicht-dispose-te” LL-Instanz führt
zum Absturz beim Programmwechsel.

Falls der Scope der ersten Instanz schon so lange “verlassen” ist,
dass die Instanz bereits aus dem Speicher entfernt wurde läuft alles wie
gewünscht aber wenn zwei LL-Instanzen “gleichzeitig” vom Garbage
Collector gelöscht werden, dann kommt es zu einer Speicherschutz-Verletzung.

Das Problem kann man umgehen, in dem man entweder zwischen zwei
Ausdrucken ein bischen wartet und in der Anwendung rumklickert (nicht
ganz ernst gemeint) oder von JEDER LL-Instanz am Ende des Scopes Dispose
aufruft - das ist natürlich vor allem dann ungewohnt, wenn man seine
Instanzen mit dem Formdesigner erzeugt, denn dann kümmert man sich um
sowas wie Dispose ja eher nicht. Also besser mit new erzeugen und
kontrolliert Dispose() aufrufen - dann klappts auch mit dem Nachbar-Prozess.

du könntest ja in einem OnClose(…)

If (LL != null)
{
LL.Dispose();
LL = null;
}

dann ist’s sauber.

Wenn LL in den components des Forms aufgelistet wäre, würde das disposen
automatisch durchgeführt (eigenartiger Weise listet MS auch nicht
unbedingt alle eigene Komponenten, z.B. Menüs in den components auf,
obwohl diese auch ein Dispose() hätten…)

lg Ernst