C'è un problema con l'iterazione: non è thread-safe. Se si sta iterando e si accede alla cache da un altro thread, è possibile che si sia verificato un errore. La probabilità di questo è bassa, ma è un problema con le applicazioni ad alto carico. FYI, alcune implementazioni della cache non forniscono nemmeno i metodi di iterazione.
Inoltre, se si eliminano gli elementi della cache, non si desidera cancellare tutto da ogni parte del dominio dell'app, ma solo ciò che è correlato all'utente.
Quando ho affrontato questo problema, l'ho risolto aggiungendo una CacheDependency personalizzata a tutte le voci della cache.
questo è come il CacheDependency è definito:
public class CustomCacheDependency : CacheDependency
{
//this method is called to expire a cache entry:
public void ForceDependencyChange()
{
this.NotifyDependencyChanged(this, EventArgs.Empty);
}
}
//this is how I add objects to cache:
HttpContext.Current.Cache.Add(key, //unique key
obj,
CreateNewDependency(), //the factory method to allocate a dependency
System.Web.Caching.Cache.NoAbsoluteExpiration,
new TimeSpan(0, 0, ExpirationInSeconds),
System.Web.Caching.CacheItemPriority.Default,
ReportRemovedCallback);
//A list that holds all the CustomCacheDependency objects:
#region dependency mgmt
private List<CustomCacheDependency> dep_list = new List<CustomCacheDependency>();
private CustomCacheDependency CreateNewDependency()
{
CustomCacheDependency dep = new CustomCacheDependency();
lock (dep_list)
{
dep_list.Add(dep);
}
return dep;
}
//this method is called to flush ONLY my cache entries in a thread safe fashion:
private void FlushCache()
{
lock (dep_list)
{
foreach (CustomCacheDependency dep in dep_list) dep.ForceDependencyChange();
dep_list.Clear();
}
}
#endregion
fonte
2014-07-01 21:53:17
mi piacerebbe prova a riavviare il sito in IIS o a riciclare il pool di applicazioni. Altrimenti potresti esporre una pagina che cancella manualmente tutto dalla cache. – millimoose
@xarzu In quali circostanze si desidera cancellare la cache? –