Si supponga che ho il seguente oggettogestione della memoria/cache per gli oggetti costosi in C#
public class MyClass
{
public ReadOnlyDictionary<T, V> Dict
{
get
{
return createDictionary();
}
}
}
Si supponga che ReadOnlyDictionary
è una sola lettura wrapper Dictionary<T, V>
.
Il metodo createDictionary
richiede molto tempo per il completamento e il dizionario restituito è relativamente grande.
Ovviamente, voglio implementare una sorta di memorizzazione nella cache in modo da poter riutilizzare il risultato di createDictionary
ma anche io non voglio abusare di Garbage Collector e utilizzare molta memoria.
Ho pensato di utilizzare WeakReference
per il dizionario ma non sono sicuro se questo è l'approccio migliore.
Cosa mi consiglia? Come gestire correttamente il risultato di un metodo costoso che potrebbe essere chiamato più volte?
UPDATE:
Sono interessato a un consiglio per una libreria C# 2.0 (DLL singolo, non-visuale). La libreria potrebbe essere utilizzata in un desktop di un'applicazione Web.
UPDATE 2:
La questione è rilevante per sola lettura oggetti pure. Ho cambiato il valore della proprietà da Dictionary
a ReadOnlyDictionary
.
UPDATE 3:
Il T
è di tipo relativamente semplice (stringa, ad esempio). Il V
è una classe personalizzata. Si potrebbe presumere che un'istanza di V
sia costosa da creare. Il dizionario potrebbe contenere da 0 a un paio di migliaia di elementi.
È possibile accedere al codice da un singolo thread o da più thread con un meccanismo di sincronizzazione esterno.
sto bene, se il dizionario è GC-ed, quando nessuno lo usa. Sto cercando di trovare un equilibrio tra il tempo (che voglio mettere in cache in qualche modo il risultato di createDictionary
) e le spese di memoria (Non voglio tenere memoria occupato più del necessario).
E riguardo l'utilizzo di sistemi esterni? memcached (con scadenza) forse? – eyossi
È per un'applicazione web o desktop? – McGarnagle
@dbaseman si prega di consultare il mio aggiornamento alla domanda. – Bobrovsky