2009-07-06 3 views
5

Есть ли способ просмотреть кеш для всех объектов в кеше? Я динамически создаю объекты, и мне нужно периодически просматривать список, чтобы очистить объекты, которые я больше не использую.Список объектов в httpcontext.current.cache

+0

Спасибо всем за удивительным обратной связи. Никогда не думал, что это будет много хорошего. Упреки для всех! Спасибо – Jeff

ответ

5

Да, вы можете либо индекс на основе ключа кэша, или вы можете перемещаться по содержимому:

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

Почему downvote? Я не могу улучшить, если вы не скажете мне, где я ошибаюсь. –

+0

Я не спускал вниз, но я должен посмотреть на другие ответы, чтобы определить, что такое переменная «c» и как ее использовать в вашем примере. Я думаю, что вы ответили на суть вопроса, но это то, как перечислять объекты в кеше. – slolife

+0

Спасибо за информацию. –

6

Вы можете перечислить через объекты:

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

Вот В.Б. чтобы перебирать кеш и возвращать представление 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

Поскольку вы потенциально хотите быть удаление элементов из Cache объекта, это не очень удобно перебирать над ним (как IEnumerable), так как это не позволяет удаление в процессе итерации. Однако, учитывая, что вы не можете получить доступ к элементам по индексу, это единственное решение.

Немного LINQ может, однако, упростить проблему. Попробуйте что-то вроде следующего:

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

Обратите внимание, что каждый item в итерации типа DictionaryEntry.

1

Jeff, вы действительно должны искать зависимости для ваших кеш-предметов. Это правильный способ сделать это. Логически группируйте свои кэшированные данные (элементы) и устанавливайте зависимости для своих групп. Таким образом, когда вам нужно истечь всю группу, вы затрагиваете такую ​​общую зависимость, и все они ушли.

Я не уверен, что понимаю Список объектов часть.

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

Это может быть немного поздно, но я использовал следующий код легко перебрать все элементы кэша и выполнять некоторые пользовательскую логику для удаления элементов кэша, которые содержат определенную строку в их именах.

Я представил обе версии кода в VB.Net, а также C#.

VB.Net Версия

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); 
    } 
Смежные вопросы