Quando si aggiunge un articolo allo System.Web.Caching.Cache
con una data di scadenza assoluta, come nell'esempio seguente, come si comporta Asp.Net? Lo fa:Quando Asp.Net rimuove gli elementi della cache scaduti?
È sufficiente contrassegnare l'elemento come scaduto, quindi eseguire il
CacheItemRemovedCallback
al successivo tentativo di accesso?Rimuovere l'elemento dalla cache ed eseguire immediatamente lo
CacheItemRemovedCallback
?HttpRuntime.Cache.Insert(key, new object(), null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
MSDN sembra indicare che avviene immediatamente. Ad esempio, the "Expiration" section of the "ASP.NET Caching Overview" dice "ASP.NET rimuove automaticamente gli elementi dalla cache quando scadono." Analogamente, l'esempio dell'argomento "How to: Notify an Application When an Item Is Removed from the Cache" dice "Se trascorrono più di 15 secondi tra le chiamate a GetReport
[un metodo nell'esempio], ASP.NET rimuove il report dalla cache."
Tuttavia, nessuno di questi è univoco. Non dicono "la richiamata viene eseguita immediatamente" e potrei pensare a come i loro scrittori potrebbero aver pensato che l'opzione 1 di cui sopra conta come "rimuovere" un oggetto. Così ho fatto un test rapido e sporco, e ecco, sembra che si stia eseguendo immediatamente - ricevo regolarmente callback di sessanta secondi anche quando nessuno accede al mio sito.
Tuttavia, il mio test era veloce e sporco, e nei commenti alla mia risposta a Is there a way to run a process every day in a .Net web application without writing a windows service or SQL server jobs, qualcuno ha suggerito che Asp.Net in realtà rimuove la rimozione e l'esecuzione del callback fino a quando qualcosa tenta di accedere nuovamente alla cache.
Qualcuno può risolvere questo autorevolmente o è solo considerato un dettaglio di implementazione?
Non penso che ci possa essere una risposta autorevole a questa domanda perché, come a Raymond Chen piace tanto sottolineare, si interpreta il comportamento di una versione del software come autorevole per tutte le versioni future. Nella mia esperienza questa è una cattiva idea in quanto ASP.NET potrebbe cambiare il suo comportamento in qualsiasi momento e rompere la tua applicazione. – dkackman
perché non lo provi. Sul callback scrivi su un file e vedi la data di creazione e come si riferisce alla scadenza. –
@dkackman - Non ho bisogno di una risposta "ora e per sempre", sono disposto ad accontentarmi di risposte autorevoli per .NET 2.0 e 3.5. Non mi sembra proprio un dettaglio di implementazione: mi aspetterei che la documentazione dicesse da qualche parte che la rimozione effettiva non è deterministica se così fosse. Forse la MS non è d'accordo. Sto solo cercando di vedere se ho appena trascurato qualcosa nella documentazione. –