开发者

.NET 4 ObjectCache - Can We Hook Into a "Cache Expired" Event?

开发者 https://www.devze.com 2023-04-10 13:10 出处:网络
I\'ve got a simple object being cached like this: _myCache.Add(someKey, someObj, policy); Where _myCache is declared as ObjectCache (but injected via DI as MemoryCache.Default), someObj is the obje

I've got a simple object being cached like this:

_myCache.Add(someKey, someObj, policy);

Where _myCache is declared as ObjectCache (but injected via DI as MemoryCache.Default), someObj is the object i'm adding, and policy is a CacheItemPolicy.

If i have a CacheItemPolicy like this:

var policy = new CacheItemPolicy 
{ 
   Priority = CacheItemPriority.Default, 
   SlidingExpiration = TimeSpan.FromHours(1)
};

It means it will expire in 1 hour. Cool.

But what will happen is that unlucky first user after the hour will have to wait for the hit.

Is there any way i can hook into an "expire开发者_开发知识库d" event/delegate and manually refresh the cache?

I see there is a mention of CacheEntryChangeMonitor but can't find any meaninful doco/examples on how to utilize it in my example.

PS. I know i can use CacheItemPriority.NotRemovable and expire it manually, but i can't do that in my current example because the cached data is a bit too complicated (e.g i would need to "invalidate" in like 10 different places in my code).

Any ideas?


There's a property on the CacheItemPolicy called RemovedCallback which is of type: CacheEntryRemovedCallback. Not sure why they didn't go the standard event route, but that should do what you need.

http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.removedcallback.aspx


Late to the party with this one but I've just noticed an interesting difference between CacheItemUpdate and CacheItemRemove callbacks.

http://msdn.microsoft.com/en-us/library/system.web.caching.cacheitemupdatereason.aspx

In particular this comment:

Unlike the CacheItemRemovedReason enumeration, this enumeration does not include the Removed or Underused values. Updateable cache items are not removable and can thus never be automatically removed by ASP.NET even if there is a need to free memory.


This is my way to use CacheRemovedCallback event when cache expired.

I share for whom concern.

public static void SetObjectToCache<T>(string cacheItemName, T obj, long expireTime)
        {
            ObjectCache cache = MemoryCache.Default;

            var cachedObject = (T)cache[cacheItemName];

            if (cachedObject != null)
            {
                // remove it
                cache.Remove(cacheItemName);
            }

            CacheItemPolicy policy = new CacheItemPolicy()
            {
                AbsoluteExpiration = DateTimeOffset.Now.AddMilliseconds(expireTime),
                RemovedCallback = new CacheEntryRemovedCallback(CacheRemovedCallback)
            };

            cachedObject = obj;
            cache.Set(cacheItemName, cachedObject, policy);
        }

public static void CacheRemovedCallback(CacheEntryRemovedArguments arguments)
            {
                var configServerIpAddress = Thread.CurrentPrincipal.ConfigurationServerIpAddress();
                long configId = Thread.CurrentPrincipal.ConfigurationId();
                int userId = Thread.CurrentPrincipal.UserId();
                var tagInfoService = new TagInfoService();
                string returnCode = string.Empty;

                if (arguments.CacheItem.Key.Contains("DatatableTags_"))
                {
                    // do what's needed
                    Task.Run(() =>
                    {
                    });
                }

            }
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号