2012-09-24 19 views
7

Oturumlar arasında sıkça erişilecek nesnelerin listesini depolamak için HttpRuntime.Cache kullanıyorum. HttpRuntime.Cache öğesini read-only olarak okuyun

ben önbellekten öğeyi almak için aşağıdaki kod satırını kullanın: ne yazık ki _chartData güncellerken,

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

Ama, çok önbelleğe öğeyi günceller.

Önbelleğe alınan öğenin bir kopyasını nasıl alabilirim?

cevap

6

aşağıya bakın. chartData_Type'un değer türü veya referans tipi olup olmadığını bilmiyorum.

değer türü ise, kullanımı kolaydır: Referans tipi, bu karmaşık gelirse

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

Ancak sizin de sınıf için DeepCopy yöntemini uygulamak gerekir, daha sonra her nesnede için DeepCopy do liste.

DeepClone yöntemi:

bu yöntemi kullanmak için
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); 
     } 
    } 
} 

, sınıf chartData_Type[Serializable] işaretlenmiş olmalıdır:

[Serializable] 
class chartData_Type 
{} 

Yani, el derin klon yapabilirsiniz:

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

AppFabric veya NCache'nin bu sorunu çözüp çözemeyeceğini merak ediyorum. Bunu başka bir konudan sordum: http://stackoverflow.com/questions/23546817/appfabric-ncache-will-these-solve-httpruntime-cache-objects-being-updated-by-r – DrGriff

1

Kullanım:

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

O _chartData den list için tüm öğeleri kopyalar.

+0

Bunun, nesnenin derin bir kopyası olacağına dikkat edin, böylece su yapmak zorunda kalacaksınız. önbellek ve bu kopya başka bir senkronizasyon halinde kalır ... OOOOOPS! –

+0

Belki de kopyasının önbellek sürümünü nasıl güncellediğiyle ilgili küçük bir açıklama olabilir. Benim up oyu alacağım = P –

1

Liste bir başvuru türüdür ve _chartData, önbellekte saklanan orijinal nesnenin adresini tutar. Bu yüzden _chartData'yi güncellediğinizde, önbelleğe alınmış nesneyi de günceller. Ayrı bir nesne istiyorsanız, önbelleğe alınan nesneyi kopyalayın. Önbellek sadece pointer List ait için başvuruda çünkü .NET çalışır yoludur referans

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

İlgili konular