Newsgroup: it.comp.dotnet
Titolo: dispose di una window wpf

ho una piccola applicazione che apre una window (new e showdialog()),
la window apre una pagina web in un webbrowser, legge dei valori e li 
pone in una List<>, esce con un Close().
Ripete questa cosa anche per centinaia di volte .
Ad ogni nuova apertura della window, vedo che una decina di MB vengono 
scalati dalla memoria disponibile del sistema, tanto che lasciandola 
andare credo che vada in crash in qualche ora e comunque non è bello 
tutto cio :)
Forse sbaglio qualche concetto che entra in gioco in questi casi, pero 
da quello che ho letto, una Close() è sufficiente a fare il Dispose 
della window.
Domande per chi le sa:
1 Perche la memoria continua inesorabilmente a diminuire anche se la 
window viene soggetta a Close? Non c'e nulla che io stia accumulando 
come dati,trascrivo solo in un DB.
2 Se la window viene effettivamente 'Disposed' , come mai invece è 
disponibile qulasiasi sua variabile pubblica anche dopo la chiusura?
Grazie molte,
Sandro


Nei controlli WPF non hai più la dispose perché non sono wrapper di una 
risorsa nativa.
A quanto ho capito facendo dei test, il dispatcher di WPF si occupa di 
disallocare le risorse grafiche non appena queste non vengono più 
utilizzate. Questa è una mia deduzione che non ho mai trovato in alcuna 
documentazione ma che ho riscontrato dopo i test che ho descritto in 
questo mio post:
http://blogs.ugidotnet.org/raffaele/archive/2009/02/20/wpf-elaborazioni-lunghe-e-presunti-memory-leak.aspx
Se effettivamente stai riscontrando un leak le possibilità sono:
1. stai ricadendo nel caso che ho descritto in quel post e non stai 
lasciando che il dispatcher abbia il tempo di rilasciare le risorse 
grafiche.
2. le tue window in realtà sono ancora referenziate in modo diretto o 
indiretto (per esempio con un event handler) e quindi non possono 
essere buttate via nè dal GC nè dal dispatcher di wpf.
Il primo caso, una volta capito, è facile da sistemare secondo quanto 
ho scritto nel post.
Il secondo caso è facilmente diagnosticabile usando un profiler di 
memoria (
vs.net
, ants di red gate, etc.)
-- 
Raffaele Rialdi  
http://www.iamraf.net
Weblog: 
http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET - 
http://www.ugidotnet.org/


Non mi cambia, neanche col Dispatcher.Invoke del tuo interessante 
articolo......ho tolto anche qualsiasi referenza alle window , che 
comunque erano soltanto riguardanti letture di variabili una volta 
closed. A me questo webbrowser non mi suona...tra l'altro sono arrivato 
a questa piccola architettura (main window e window in showdialog) 
perche un unico webbrowser sulla stessa main window, prima o poi si 
'incollava' e non caricava la nuova pagina. In questo modo almeno ogni 
volta si 'rinnova'.  Ma temo fortemente che ne rimanga qualche pezzetto 
in giro.

 che ne rimanga qualche pezzetto in giro.
Tutto quanto dicevo prima sul discorso Dispose non vale per il 
controllo webbrowser che usa IE in interop e quindi (come avrai già 
visto) ha il metodo Dispose che deve essere chiamato.
Non so bene come stai facendo ma sull'evento/command di Close della 
Window che contiene il webbrowser, chiama la dispose del webbrowser 
stesso.
Per curiosità verifica anche se vengono aperti tanti processi 
iexplore.exe o no.
Se non riesci a trovare una causa, la strada più veloce è quella di 
usare un profiler.



No, ho controllato e non vengono aperti processi iexplore aprendo la 
window che possiede il webbrowser. E comunque va MOLTO meglio chiamando 
la Dispose() del webbrowser in chiusura. Mi perdo ancora qualcosina in 
memoria ad ogni chiamata/chiusura, ma è quasi nullo e tra l'altro sembra 
che non tutto venga recuperato immediatamente, ma anche avanti nel tempo.
Grazie Raf, per ora va benissimo cosi, ora andrà stressato per vedere 
cosa accade su tempi lunghi.
E' da tenere a mente questa cosa del webbrowser....
Sandro

 E' da tenere a mente questa cosa del webbrowser....
Se è così, il problema è solo quello.
Le differenze che vedi in memoria sono parte del normale comportamento 
del GC che è non-deterministico.
Come regola generale, dove c'è una Dispose è sempre meglio chiamarla 
non appena non usi più l'oggetto.
Ciao!
