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
Odpowiedz
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
Dlaczego spadł? Nie mogę się poprawić, jeśli nie powiesz mi, gdzie się myliłem. –
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
Dzięki za informacje. –
można wyliczyć za pomocą obiektów:
System.Web.HttpContext.Current.Cache.GetEnumerator()
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
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
.
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.
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);
}
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);
}
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