2012-09-24 16 views
7

Estoy usando un HttpRuntime.Cache para almacenar una lista de objetos que accederán con frecuencia en todas las sesiones.Lea el elemento HttpRuntime.Cache como de solo lectura

utilizo la siguiente línea de código para obtener el elemento de la caché:

List<chartData_Type> _chartData = 
      (List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth"); 

Pero, por desgracia, cuando se actualiza el _chartData, actualiza el elemento de la caché también.

¿Cómo puedo obtener una copia del elemento almacenado en caché?

Respuesta

6

Esa es la forma en la que funciona .NET debido caché simplemente referencia a los puntero de List. No sé si chartData_Type es un tipo de valor o tipo de referencia.

Si el tipo de valor, es fácil de usar:

List<chartData_Type> list = new List<chartData_Type>(_chartData); 

Pero si el tipo de referencia, se trata de complicado, es necesario implementar DeepCopy método para su clase, y luego hacer DeepCopy para cada objeto en lista.

DeepClone método:

public static class CloneHelper 
{ 
    public static T DeepClone<T>(T obj) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(ms, obj); 
      ms.Position = 0; 

      return (T) formatter.Deserialize(ms); 
     } 
    } 
} 

Para utilizar este método, clase chartData_Type debe estar marcado [Serializable]:

[Serializable] 
class chartData_Type 
{} 

Por lo tanto, se puede hacer clon de profundidad manualmente:

var cloneChartData = _chartData.Select(d => 
             CloneHelper.DeepClone<chartData_Type>(d)) 
         .ToList(); 
+0

Me pregunto si AppFabric o NCache resolvería este problema. Le pregunté esto en otro hilo: http://stackoverflow.com/questions/23546817/appfabric-ncache-will-these-solve-httpruntime-cache-objects-being-updated-by-r – DrGriff

1

Uso:

List<chartData_Type> list = new List<chartData_Type>(_chartData); 

Se copiará todos los artículos _chartData-list.

+0

Tenga en cuenta que esta será una copia profunda del objeto, por lo que tendrá que hacer su re que el caché y esta copia permanecen sincronizados de lo contrario ... ¡OOOOOPS! –

+0

Quizás una pequeña explicación de por qué su copia también está actualizando la versión del caché. Obtendré mi voto = P –

1

La lista es un tipo de referencia y _chartData contiene la dirección del objeto original almacenado en la caché. Es por eso que cuando actualiza _chartData, también actualiza el objeto en caché. Si desea un objeto separado, clone el objeto en caché. Vea a continuación referencia

http://www.codeproject.com/Articles/33364/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca

http://www.codeproject.com/Articles/45168/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca

Cuestiones relacionadas