Usercontrol sauber entladen

R

Rainer Hocker

Hallo!

Ich habe eine Applikation, bei der der Anwender verschiedene Fenster gezeigt
bekommt. Da das alles mit einem TabControl zu unübersichtlich geworden wäre,
hab ich einfach ein großes Main-Form genommen und alle Unterfenster als
UserControls gestaltet. Diese werden bei bedarf über das Menü geladen,
angezeigt und beim Betätigen eines Schließen-Buttons werden sie wieder
entladen (this.Dispose()).

Jetzt habe ich festgestellt, dass dieses Entladen scheinbar nicht
funktioniert. Es blieben immer noch Teile der Controls am Leben. Zuerst ist
mir das an einem Timer aufgefallen, der einfach im entladenen UserControl
weitergelaufen ist. Wenn er sein tick-Event feuert, greift der Code dort
aber auf die Controls zu, die mit dem UserControl schon längst entladen
sind.
Also hab ich entsprechende try/catch-Anweisungen eingeführt, in denen ich
auf ObjectDisposed abfange.
Jetzt hab ich gesehen, dass auch sonstige Events, die irgendwo gefeuert
werden, wieder zum Reaktivieren des schon entladenen Controls führen. Z.B.
hab ich in einem UserControl ein InputPanel mit dem Event "Eanabled"
abgefragt. Wenn ich jetzt das InputPanel irgendwo im ProgrammContext
aufrufe, wird auch die Eventroutine im schon entladenen UserControl wieder
angesprochen.

Meine Frage: Wie gehe ich denn sauber mit dem Problem um? Wie kann ich denn
das UserControl wirklich sauber entladen? Muss ich da den GarbageColector
noch per Hand anschubsen? Oder hab ich ein generelles Architekturproblem,
weil UserControls nicht dynamisch ge-/entladen werden sollten? Oder ist das
eine Macke des Compact-Frameworks?

Danke!!!
 
D

Dennis Borde

Hallo Rainer,
das Problem kenn ich. Da man nicht weiß, wann der GC denn das Objekt endlich
auffrisst und so der "Destruktor" nicht unbedingt zum gewünschten Zeitpunkt
aufgerufen wird, sollte man das per Hand machen.
Gib deinen Controls ne Close()-Methode (oder halt etwas in der Art), die du
dann immer aufrufst, wenn du das Control schließen willst. Diese Methode
kann zwar keinen Speicher wieder freigeben (das macht ja der GC), aber sie
kann das Objekt deaktivieren - also Timer ausschalten etc.
__
Grüße, Dennis
PS: In einer englisch sprachigen Newsgroup wird man mit Deutsch wohl nicht
unbedingt immer ans Ziel kommen. ;-)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top