Срок действия кэшированного элемента вручную / немедленно - PullRequest
1 голос
/ 22 августа 2011

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

Итак, а) можно ли установить кэшированный элемент так, чтобы он никогда не истек (кроме установки срока действия, скажем, 1 год в будущем), и б) как вручную заставить элемент истечь?

Спасибо!

Ответы [ 3 ]

1 голос
/ 22 августа 2011

возможно ли установить кэшированный элемент, срок действия которого не истекает (кроме установки срока действия, скажем, 1 год в будущем)

Сортировка - Insert метод имеет перегрузку, которая поддерживает это: ( ссылка )

DataSet myDataSet = getDataSet();

Page.Cache.Insert("MyDataSetCacheKey", myDataSet)

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

как вручную заставить элемент истечь?

Я предполагаю, что вы имеете в виду здесь: «Я кэшировал эти данные навсегда, но теперь я хочу их изменить».В этом случае вы не истечете, вы просто удалите его из кэша:

Page.Cache.Remove("MyDataSetCacheKey")

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

1 голос
/ 22 августа 2011

Я думаю, что это будет работать для вас.Затем, когда вы будете готовы обновить элемент, вы удалите его из кэша вручную и установите его снова ...

Page.Cache.Add("object", 
            "something", 
            null, 
            System.Web.Caching.Cache.NoAbsoluteExpiration, 
            System.Web.Caching.Cache.NoSlidingExpiration, 
            CacheItemPriority.NotRemovable, 
            new CacheItemRemovedCallback((s, o, r) =>
            {
                // some callback code if you want...
            }));

ОБНОВЛЕНО (лучше демо):

    private int _counter = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        // You can add the cache key like this
        AddToCache("key", () => "some object " + _counter++);

        //Any time you want to refresh the value, you can call RefreshCachedValue
        RefreshCachedValue("key");
        RefreshCachedValue("key");
        RefreshCachedValue("key");
        RefreshCachedValue("key");
        RefreshCachedValue("key");
        // In this demo, the cached value is now "some object 5"
    }

    private void AddToCache(string key, Func<object> getValueFunction)
    {
        Page.Cache.Add(key,
            getValueFunction(), 
            null, 
            System.Web.Caching.Cache.NoAbsoluteExpiration, 
            System.Web.Caching.Cache.NoSlidingExpiration, 
            CacheItemPriority.NotRemovable, 
            new CacheItemRemovedCallback((s, o, r) =>
            {
                AddToCache(s, getValueFunction);
            }));
    }

    private void RefreshCachedValue(string key)
    {
        Page.Cache.Remove(key);
    }
0 голосов
/ 22 августа 2011

Существует несколько видов CacheDependency, вы можете использовать FileBased CacheDependency со ссылкой на пустой файл.

Если ваши данные изменятся, просто перезапишите файл.Как только файл изменится, кеш будет сброшен.

http://msdn.microsoft.com/en-us/magazine/cc163955.aspx

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