Цикл по ключам в объекте кеша ASP.NET - PullRequest
7 голосов
/ 29 ноября 2010

Кэширование в ASP.NET выглядит так, как будто используется некий ассоциативный массив:

// Insert some data into the cache:
Cache.Insert("TestCache", someValue);
// Retrieve the data like normal:
someValue = Cache.Get("TestCache");

// But, can be done associatively ...
someValue = Cache["TestCache"];

// Also, null checks can be performed to see if cache exists yet:
if(Cache["TestCache"] == null) {
    Cache.Insert(PerformComplicatedFunctionThatNeedsCaching());
}
someValue = Cache["TestCache"];

Как видите, выполнение нулевой проверки объекта кэша очень полезно.

Но я хотел бы реализовать функцию очистки кэша, которая может очищать значения кэша где я не знаю целое имя ключа. Как кажется, ассоциативная массив здесь, это должно быть возможно (?)

Может кто-нибудь помочь мне выработать способ циклического перебора сохраненных ключей кеша и выполнять простую логику на них? Вот что я ищу:

static void DeleteMatchingCacheKey(string keyName) {
    // This foreach implementation doesn't work by the way ...
    foreach(Cache as c) {
        if(c.Key.Contains(keyName)) {
            Cache.Remove(c);
        }
    }
}

1 Ответ

5 голосов
/ 29 ноября 2010

Не используйте цикл foreach при удалении элементов из любого типа коллекции - цикл foreach полагается на использование перечислителя, который НЕ позволит вам удалять элементы из коллекции (перечислитель сгенерирует исключение, если коллекция повторяетсяover имеет элементы, добавленные или удаленные из него).

Вместо этого используйте циклическое переключение ключей кэша:

int i = 0;
while (i < Cache.Keys.Length){
   if (Cache.Keys(i).Contains(keyName){
      Cache.Remove(Cache.Keys(i))
   } 
   else{
      i ++;
   }
}
...