singelton und garbage collector - was zu hö...?

04/11/2010 - 13:13 von Siebert Kunze | Report spam
Moin erstmal,

ich wollte gerade eine Anwendung etwas Speicher optimieren, jetzt bin ich an
einem Punkt, wo ich nicht weiter weiß.

Ich habe ein TrayApp, das beim Doppelklick eine Form erzeugt. Die Form ist
ein Singleton (lazy installation Ansatz). Beim Closing/Closed- Event soll
der speicher frei werden, damit nicht immer 20MB Daten und Grafik
mitgeschleppt werden. Leider funktioniert irgend etwas GC nicht. Der
Ressourcen Monitor verràt, dass die App. beim Schließen der Form nicht
kleiner wird. Jetzt kommt es aber noch besser, weil die Form ja ein
Singleton ist kann ich Sie nicht per Doppelklick aufs TrayIcon neu erzeugen,
weil Sie ja im GC zur Freigabe noch "festhàngt".

Hier was ich probiert habe:

Form1 ist IDisposable
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose();
GC.Collect();
GC.SuppressFinalize(this);
//GC.WaitForPendingFinalizers(); // man kann wohl lange
warten
}


Also die Frage an die Kommune: Gibt's da was besonderes zu beachten? Ich
vermute ja was absonderliches wie evtl. GC im Destruktor aufrufen?
Jedenfalls muss ein Singleton in der OOP doch im Stande sein sein
Lebenszyklus selbst zu beenden und sein Dasein auch aus dem Speicher zu
tilgen, um anschließend neu geboren zu werden, oder!?

Gruß, Siebert.
 

Lesen sie die antworten

#1 Thomas Scheidegger
04/11/2010 - 13:49 | Warnen spam
?Hallo Siebert

das beim Doppelklick eine Form erzeugt...



wie wird die Form erzeugt + angezeigt?
per Show oder ShowDialog?
Lies etwa
http://msdn.microsoft.com/de-de/lib...8wzka.aspx
"Dispose wird automatisch aufgerufen, wenn das Formular mit der Show-Methode
angezeigt wird.
Wenn eine andere Methode, z. B. ShowDialog, verwendet wird
oder das Formular nie angezeigt wird, müssen Sie Dispose manuell in der
Anwendung aufrufen."


Beim Closing/Closed- Event soll der speicher frei werden



ich denke der Closed- Event ist mal eher der falsche (zu frühe) Ort für
'Dispose'...

Der Ressourcen Monitor verràt...
nicht immer 20MB Daten und Grafik mitgeschleppt



erstens sind 20MB bei .NET Apps eher nahe am Minimum,
und zweitens werden bei GC nur Instanzen freigegeben,
jedoch nicht der zugrundeliegende Heap-Speicher als ganzes.
Welcher 'Monitor'? Dort welcher genaue Wert = 20MB?

PS
Falls deine TrayApp danach typisch lànger inaktiv bleibt,
könnte man per Win32 API:
SetProcessWorkingSetSize( handle, -1,-1)
http://www.pinvoke.net/default.aspx...ingsetsize

rein 'virtuell' nachhelfen, der Speicher muss dann aber
bei Reaktivierung der TrayApp wieder nachgeladen werden,
was uU von Festplatte (langsam/verzögert) ist.

FYI:
MS hat diese Newsgroup offiziell geschlossen
ist nur noch bei einigen Providern verfügbar,
MS Web-Forum für C# wàre
http://social.msdn.microsoft.com/Fo...alcsharpde





Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen