Adeguata implementazione di IDisposable con Silverlight?
-
20-08-2019 - |
Domanda
Sto lavorando su un'app Silverlight usando il modello MVVM. My ViewModel attualmente è costituito da una proprietà che rappresenta una raccolta di oggetti modello:
public ObservableCollection<IndexEntry> IndexList
{
get;
set;
}
ha anche diversi metodi che popoleranno quella raccolta con dati che ritornano da un servizio web.
Poiché le istanze di questa classe possono essere create e distrutte nel corso del runtime dell'applicazione, devo implementare IDisposable
e impostare il riferimento della proprietà su null o la distruzione di questa classe sarà sufficiente per rimuovere tutti i riferimenti alla raccolta questa proprietà si riferisce a? Ci sono avvertenze che potrebbero lasciare un riferimento in giro?
Grazie.
Soluzione
L'unico modo in cui un riferimento sopravvive alla raccolta dei rifiuti è se è rootato. Se è ancora in uso un'altra classe che contiene un riferimento a ObservableCollection, allora ObservableCollection non verrà distrutto, indipendentemente dal fatto che sia stato impostato su null. Ad esempio, supponiamo che esista un oggetto "in memoria" che è la tua raccolta. Hai un riferimento ad esso, nella tua proprietà. Qualche altro codice esegue la riga & Quot; ObservableCollection & Lt; & Gt; myOtherReference = YourObject.IndexList; " ;. Ora hanno anche un riferimento all'oggetto di memoria reale. Se si annulla il riferimento alla proprietà, si eliminerà solo il riferimento alla proprietà; il riferimento 'myOtherReference' non è interessato, poiché ora punta direttamente alla memoria e non alla tua proprietà. Se vuoi davvero eliminare questo elemento dalla memoria, devi rimuovere TUTTI i riferimenti o implementare una logica di "smaltimento" decisiva, a quel punto & Quot; myOtherReference & Quot; sarebbe un puntatore a un oggetto disposto e qualsiasi chiamata ad esso genererà un'eccezione.
Altri suggerimenti
GWLlosa è perfetto. Inoltre, l'associazione dati Silverlight manterrà il ViewModel bloccato finché si dispone di un riferimento di associazione ad esso. In altre parole, & # 8217; sarà necessario rimuovere ViewModel dal DataContext della vista (impostando View.DataContext = null) oppure sarà necessario rimuovere la vista dall'albero visivo prima che ViewModel venga rilasciato . L'implementazione di IDisposable non avrebbe aiutato & # 8217; t e non lo avrei & # 8217; lo consiglio davvero. IDisposable è inteso per ripulire le risorse non gestite o per avere un maggiore controllo sullo smaltimento delle risorse gestite. In questo caso non è necessario se capisci correttamente come funzionano i collegamenti e i riferimenti e lasci che il garbage collector si occupi delle cose. Questo articolo potrebbe aiutare:
Ricerca di perdite di memoria nelle applicazioni WPF
It & # 8217; è principalmente WPF ma puoi usare anche le tecniche su Silverlight.
Fantastico vederti usare ViewModel a proposito. I & # 8217; sono un grande fan del modello.