2009-07-06 8 views
5

Czy istnieje sposób, aby przejrzeć zawartość pamięci podręcznej dla wszystkich obiektów w pamięci podręcznej? Dynamicznie tworzę obiekty i muszę okresowo przeglądać listę, aby usunąć obiekty, których już nie używam.Lista obiektów w httpcontext.current.cache

+0

Dzięki wszystkim za niesamowite zwrotnych. Nigdy nie sądziłem, że będzie tak wiele dobrych sposobów. Awansuj dla wszystkich! Dzięki – Jeff

Odpowiedz

5

Tak, można albo indeks oparty na kluczu pamięci podręcznej, albo można iteracyjne nad zawartością:

For Each c In Cache 
    ' Do something with c 
Next 
' Pardon my VB syntax if it's wrong 
+0

Dlaczego spadł? Nie mogę się poprawić, jeśli nie powiesz mi, gdzie się myliłem. –

+0

Nie spadłem, ale muszę popatrzeć na inne odpowiedzi, aby określić, czym jest zmienna "c" i jak z niej korzystać w twoim przykładzie. Myślę, że jednak odpowiedziałeś na sedno pytania, w jaki sposób wyświetlać obiekty w pamięci podręcznej. – slolife

+0

Dzięki za informacje. –

6

można wyliczyć za pomocą obiektów:

System.Web.HttpContext.Current.Cache.GetEnumerator() 
3

Oto VB funkcja do iteracji w pamięci podręcznej i zwrócenia reprezentacji DataTable.

Private Function CreateTableFromHash() As DataTable 

    Dim dtSource As DataTable = New DataTable 
    dtSource.Columns.Add("Key", System.Type.GetType("System.String")) 
    dtSource.Columns.Add("Value", System.Type.GetType("System.String")) 
    Dim htCache As Hashtable = CacheManager.GetHash() 
    Dim item As DictionaryEntry 

    If Not IsNothing(htCache) Then 
     For Each item In htCache 
      dtSource.Rows.Add(New Object() {item.Key.ToString, item.Value.ToString}) 
     Next 
    End If 

    Return dtSource 

End Function 
1

Ponieważ potencjalnie chcą być usuwanie elementów z obiektu Cache, nie jest strasznie wygodna iteracyjne nad nim (jako IEnumerable), ponieważ nie pozwala usunięcie podczas procesu iteracji. Jednak biorąc pod uwagę, że nie można uzyskać dostępu do elementów według indeksu, jest to jedyne rozwiązanie.

Trochę LINQ może jednak uprościć problem. Spróbuj coś jak poniżej:

var cache = HttpContext.Current.Cache; 
var itemsToRemove = cache.Where(item => myPredicateHere).ToArray(); 
foreach (var item in itemsToRemove) 
    cache.Remove(itemsToRemove.Key); 

pamiętać, że każdy item w iteracji jest typu DictionaryEntry.

1

Jeff, powinieneś naprawdę sprawdzić zależności dla swoich pozycji w pamięci podręcznej. To jest właściwy sposób robienia tego. Logicznie pogrupuj swoje buforowane dane (elementy) i skonfiguruj zależności dla swoich grup. W ten sposób, gdy musisz wygaśnąć całą grupę, dotkniesz tak powszechnej zależności i wszystkie znikną.

Nie jestem pewien, czy rozumiem część z obiektu Lista obiektu.

15
 var keysToClear = (from System.Collections.DictionaryEntry dict in HttpContext.Cache 
          let key = dict.Key.ToString() 
          where key.StartsWith("Something_") 
          select key).ToList(); 


     foreach (var key in keysToClear) 
     { 
      HttpContext.Cache.Remove(key); 
     } 
2

To może być trochę późno, ale używany następujący kod do łatwego iteracyjne nad wszystkie elementy bufora i wykonać jakąś niestandardową logikę do usuwania elementów z pamięcią podręczną, które zawierają pewien ciąg w ich nazwach.

Podałem obie wersje kodu w VB.Net, jak również C#.

VB.Net Wersja

Dim cacheItemsToRemove As New List(Of String)() 
Dim key As String = Nothing 
'loop through all cache items 
For Each c As DictionaryEntry In System.Web.HttpContext.Current.Cache 
    key = DirectCast(c.Key, String) 
    If key.Contains("prg") Then 
     cacheItemsToRemove.Add(key) 
    End If 
Next 
'remove the selected cache items 
For Each k As var In cacheItemsToRemove 
    System.Web.HttpContext.Current.Cache.Remove(k) 
Next 

C# Version

List<string> cacheItemsToRemove = new List<string>(); 
string key = null; 
//loop through all cache items 
foreach (DictionaryEntry c in System.Web.HttpContext.Current.Cache) 
    { 
     key = (string)c.Key; 
     if (key.Contains("prg")) 
     { 
      cacheItemsToRemove.Add(key); 
     } 
    } 
//remove the selected cache items 
foreach (var k in cacheItemsToRemove) 
    { 
     System.Web.HttpContext.Current.Cache.Remove(k); 
    }