2012-02-24 1 views
7

Sfondo: sto scrivendo l'applicazione Web ASP.NET MVC 3. Ho uno List<MyObject> (in realtà diversi elenchi) di oggetti che voglio tenere nella cache grazie alla comoda funzionalità di scadenza automatica e alla sicurezza del thread.System.Web.Caching.Cache Disporre gli oggetti eliminati dalla cache?

Ciascuno di questi oggetti contiene internamente l'istanza di System.Threading.Semaphore utilizzata per l'implementazione push interna del server.

Quindi mi chiedo come cambierà il ciclo di vita dei miei oggetti se li metto in cache? Questo può creare problemi con il threading/NullReferenceExceptions se la cache dispone effettivamente di oggetti che cancella/etc.? Forse altri ovvi motivi per non farlo?

TIA.

risposta

9

La cache non espone esplicitamente oggetti quando vengono espulsi dalla cache per qualsiasi motivo. Si potrebbe provare questo provandola, ma se questo era il caso sarebbe nella documentazione, e non è:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

Il ciclo di vita degli oggetti nella cache può essere prorogato di essere in la cache, poiché la cache contiene un riferimento a loro. Se vuoi evitare questo, puoi invece memorizzare un riferimento debole.

http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

Se si esegue questa operazione non ci dovrebbero essere le implicazioni del ciclo di vita di memorizzare il riferimento nella cache.

Una cosa a cui pensare - dici di voler usare la cache perché è thread-safe. È necessario essere consapevoli che l'oggetto cache stesso è thread-safe, ma se si memorizza nella cache un oggetto non thread-safe nella cache che non rende automaticamente l'oggetto memorizzato nella cache automaticamente thread-safe. Nello specifico, List<T> non è thread-safe e la sua memorizzazione nella cache non lo cambierà. Utilizzare le raccolte simultanee se si desidera garantire la sicurezza dei thread.

+0

Grazie per la risposta! Ora mi sento un po 'più a mio agio. Non mi preoccupo di estendere il ciclo di vita - questo potrebbe anche aggiungere punti per questa soluzione per me. Se non ci saranno altre risposte nel prossimo futuro, accetterò la tua risposta. –

+3

Si noti che è possibile rendere disponibili gli oggetti, se necessario, specificando un metodo di richiamata di rimozione. – Rozwel

+0

@Rozwel: Grazie, lo capisco. Volevo solo garantire il contrario: gli oggetti non verranno rimossi automaticamente. –