C#MemoryCache UpdateCallback参数不提供要删除的项

时间:2018-05-17 11:36:57

标签: c# caching c#-4.0 memorycache

我正在使用C#MemoryCache来保留一些项目。

Helper类,一般处理项目存储

public static class MemoryCacheHelper
{
    public static T Get<T>(string key, object lockHandle)
    {
        lock (lockHandle)
        {
            return (T) MemoryCache.Default.Get(key);
        }
    }

    public static T GetOrAdd<T>(string key, int seconds, object lockHandle, Func<T> factory, Action<CacheEntryUpdateArguments> onRemoveAction)
    {
        var cacheItemPolicy = new CacheItemPolicy
        {
            AbsoluteExpiration = DateTime.Now.AddSeconds(seconds),
            UpdateCallback = args => onRemoveAction(args),
            Priority = CacheItemPriority.NotRemovable
        };

        lock (lockHandle)
        {
            var existingObj = (T) MemoryCache.Default.Get(key);
            if (existingObj != null)
                return existingObj;

            var newObj = factory.Invoke();
            MemoryCache.Default.Set(key, newObj, cacheItemPolicy);
            return newObj;
        }
    }
}

用法示例

var ret = MemoryCacheHelper.GetOrAdd(sessionKey, SessionTime, ConnectionSessionSync,
    factory: () => GetNewConnection(environmentId, token),
    onRemoveAction: args =>
    {
        // does not work because UpdatedCacheItem is null
        // var da = args.UpdatedCacheItem.Value as ITeradataDataAccess;

        // works! 
        var da = MemoryCacheHelper.Get<ITeradataDataAccess>(sessionKey, ConnectionSessionSync);
        da?.Dispose();
    });

根据CacheItemPolicy文档UpdateCallback在项目从缓存中逐出之前被调用:

  

获取或设置对CacheEntryUpdateCallback委托的引用   在从缓存中删除缓存条目之前调用:

     

获取或设置对CacheEntryUpdateCallback委托的引用   在从缓存中删除缓存条目之前调用。

确实MemoryCache.Default.Get(key)仍会返回正确的引用。

但是,我希望此回调中的上下文提供此引用,而不必从缓存本身(即args.UpdatedCacheItem)获取它。

问题:为什么UpdateCallback参数不提供要删除的项目?我觉得缓存设置有问题。

注意:我的项目面向.NET Framework 4.5.2

0 个答案:

没有答案