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

C#MemoryCache UpdateCallback参数不提供要删除的项,c#,caching,c#-4.0,memorycache,C#,Caching,C# 4.0,Memorycache,我正在使用C#保存一些项目 帮助器类来一般处理存储项 公共静态类MemoryCacheHelper { 公共静态T Get(字符串键、对象锁句柄) { 锁(锁柄) { return(T)MemoryCache.Default.Get(key); } } 公共静态T GetOrAdd(字符串键、整数秒、对象锁句柄、函数工厂、操作onRemoveAction) { var cacheItemPolicy=新的cacheItemPolicy { 绝对过期=DateTime.Now.AddSeconds

我正在使用C#保存一些项目

帮助器类来一般处理存储项
公共静态类MemoryCacheHelper
{
公共静态T Get(字符串键、对象锁句柄)
{
锁(锁柄)
{
return(T)MemoryCache.Default.Get(key);
}
}
公共静态T GetOrAdd(字符串键、整数秒、对象锁句柄、函数工厂、操作onRemoveAction)
{
var cacheItemPolicy=新的cacheItemPolicy
{
绝对过期=DateTime.Now.AddSeconds(秒),
UpdateCallback=args=>onRemoveAction(args),
优先级=CacheItemPriority.NotRemovable
};
锁(锁柄)
{
var existingObj=(T)MemoryCache.Default.Get(key);
if(existingObj!=null)
返回现有对象;
var newObj=factory.Invoke();
MemoryCache.Default.Set(key、newObj、cacheItemPolicy);
返回newObj;
}
}
}
用法示例
var ret=memorycacheheloper.GetOrAdd(sessionKey、SessionTime、ConnectionSessionSync、,
工厂:()=>GetNewConnection(环境ID,令牌),
onRemoveAction:args=>
{
//无法工作,因为UpdatedCacheItem为null
//var da=args.UpdatedCacheItem.Value作为iteradataAccess;
//工作!
var da=memorycacheheloper.Get(sessionKey,ConnectionSessionSync);
da?.Dispose();
});
根据文档
UpdateCallback
在从缓存中逐出项之前被调用:

获取或设置对以下对象的CacheEntryUpdateCallback委托的引用: 在从缓存中删除缓存项之前调用:

获取或设置对以下对象的CacheEntryUpdateCallback委托的引用: 在从缓存中删除缓存项之前调用

实际上,
MemoryCache.Default.Get(key)
仍然返回正确的引用

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

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


注意:我的项目目标是.NET Framework 4.5.2

为什么UpdateCallback参数不提供要删除的项?
,因为它不提供-。在某种程度上,这似乎是一个合理的决定-如果你想要它,你可以直接从
内存缓存中取出它。@mjwills-哦,这是设计出来的。我想我错过了一些我的设置。我不知道是否只有我一个人,但我希望该上下文提供对即将从缓存中移出的对象的引用。属性似乎在那里,但它是
null
,因此没有任何用处。谢谢
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();
    });