Кэшированный элемент никогда не истекает - PullRequest
5 голосов
/ 22 января 2010

У меня есть класс, который содержит следующее свойство:

public Dictionary<string, int> CommentCounts {
    get {
        string cacheKey = "CommentCounts";
        HttpContext c = HttpContext.Current;

        if (c.Cache[cacheKey] == null) {
            c.Cache.Insert(cacheKey, new Dictionary<string, int>(), null, DateTime.UtcNow.AddSeconds(30), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, null);
            c.Trace.Warn("New cached item: " + cacheKey); 
        }

        return (Dictionary<string, int>)c.Cache[cacheKey];
    }
    set {
        HttpContext.Current.Cache["CommentCounts"] = value;
    }
}

Кажется, что оператор Trace выполняется только один раз, а не каждые 30 секунд после истечения срока действия элемента Cache. Единственный способ, которым я могу заставить его обновить элемент Cached, - это реализовать шанс кода и пересобрать проект, что явно не идеально.

Чего мне не хватает? Заранее спасибо ...

Ответы [ 2 ]

8 голосов
/ 22 января 2010

Часть свойства set, вероятно, является причиной - Cache["key"] = value эквивалентно вызову Cache.Insert с NoAbsoluteExpiration, NoSlidingExpiration, что означает, что срок его действия не истекает. Правильное решение будет выглядеть так:

public Dictionary<string, int> CommentCounts {
    get {
        const string cacheKey = "CommentCounts";
        HttpContext c = HttpContext.Current;

        if (c.Cache[cacheKey] == null) CommentCounts = new Dictionary<string, int>();

        return (Dictionary<string, int>)c.Cache[cacheKey];
    }
    set {
        const string cacheKey = "CommentCounts";
        c.Cache.Insert(cacheKey, value, null, DateTime.UtcNow.AddSeconds(30), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, null);
        c.Trace.Warn("New cached item: " + cacheKey); 
    }
}
0 голосов
/ 22 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...