Domanda

Anche se ho specificato una chiave univoca, sembra che il seguente codice restituirà un valore per 5 richieste, quindi un altro per la coppia successiva, quindi tornerà al valore salvato nella richiesta originale e continuerà fino a quando non ci sono 10 di oggetti diversi tutti memorizzati nella stessa chiave. Sembra quindi quasi casuale quale di questi valori tornerà dalla cache.

string strDateTime = string.Empty;
string cachename = "datetimeexample";
object cachedobject = HttpRuntime.Cache.Get(cachename);
if (cachedobject != null)
    strDateTime = (string)cachedobject;
else
{
    strDateTime = DateTime.Now.ToString();
    HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null);
}
Response.Write(strDateTime +"        keys:"+ HttpRuntime.Cache.Count);

Molto confuso, è a causa del threading o qualcosa del genere?

È stato utile?

Soluzione

Ignorando la possibilità di una server farm e il bilanciamento del carico, questo comportamento può essere causato dal pool di applicazioni in esecuzione come web-garden . Per citare la sezione pertinente da MSDN:

  

Perché i giardini Web consentono l'uso di   più processi, ogni processo sarà   avere una propria copia dell'applicazione   stato, stato sessione in-process,   cache e dati statici. Giardini Web   non dovrebbe essere usato per tutti   applicazioni, specialmente se ne hanno bisogno   per mantenere lo stato. Essere sicuri di   benchmark delle prestazioni del   domanda prima di decidere se   La modalità Web Garden è appropriata.

Ciò farà apparire come se la memorizzazione nella cache memorizzi più valori per la stessa chiave, con effettivamente voci duplicate nella cache.

Per risolvere questo problema in IIS 7, apri le Impostazioni avanzate del pool di applicazioni e imposta Processi di lavoro massimi su 1. Per IIS 6, vedi Articolo MSDN (con schermate graziose).

Anche se con 8 mesi di ritardo, sto rispondendo a questa domanda perché l'ho trovata molto prima di aver trovato questo articolo decente su gotchas web-garden . Spero che questa risposta salverà i futuri ricercatori un po 'di tempo. :)

Altri suggerimenti

La tua chiave di cache è sempre "datetimeexample", quindi avrai sempre un oggetto nella cache; e riceverai sempre quell'oggetto indietro.

Non sono del tutto sicuro di ciò che stai cercando di realizzare qui, per quanto mi riguarda, questo si comporta esattamente come dovrebbe fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top