Un problema con semplicemente in possesso di un dizionario di oggetti WeakReference è che non c'è modo, a corto di enumerare l'intero dizionario, di rimuovere dal Dizionario oggetti WeakReference cui gli obiettivi escono dal campo di applicazione.
Sarebbe utile se un WeakReference potesse includere un delegato che verrebbe richiamato quando l'obiettivo primario è andato fuori dal campo di applicazione. Per quanto ne so, non c'è modo di farlo. Se non ti dispiace aggiungere un altro campo e un piccolo codice agli oggetti che stai memorizzando nel tuo "dizionario debole", ti suggerisco di creare quello che chiamo un oggetto "Finasposer", il cui unico campo è un MethodInvoker; quando è eliminato, MethodInvoker deve essere annullato; il finalizzatore dovrebbe Interlocked.Exchange() il MethodInvoker a null e - se il suo vecchio valore era non nullo - invocarlo. L'oggetto da scrivere nel dizionario dovrebbe creare un nuovo oggetto Finasposer, con un delegato che farà sì che la chiave venga rimossa dal dizionario quando è conveniente.
Si noti che né il finalizzatore né alcun delegato invocato in tal modo non devono mai manipolare direttamente il dizionario, né eseguire operazioni che richiedono l'acquisizione di un blocco. Se il Finasposer detiene un delegato, il delegato stesso è garantito valido quando Finalize viene eseguito, ma l'oggetto collegato al delegato e qualsiasi oggetto a cui si fa riferimento in tal modo potrebbe trovarsi in stati imprevisti. Dovrebbe essere sicuro, tuttavia, per il metodo chiamato da Finasposer per aggiungere a un elenco collegato un riferimento all'oggetto che è andato fuori ambito. Il comando Aggiungi, Rimuovi e altri metodi del dizionario possono eseguire il polling dell'elenco collegato per verificare se una delle WeakReferences in essa contenute sia morta e debba essere eliminata.
http://blogs.msdn.com/b/nicholg/archive/2006/06/04/617466.aspx – Mark
Anche se non è un 'IDictionary', la [ConditionalWeakTable] (http://msdn.microsoft. it/it/us/library/dd287757.aspx) è quello che stavo davvero cercando quando Google mi ha portato qui. Grazie a [questa risposta] (http://stackoverflow.com/questions/5764556/best-time-to-cull-weakreferences-in-a-collection-in-net/5764855#5764855). –
Scoperta eccezionale! –