C#MemoryCache UpdateCallback参数不提供要删除的项
我正在使用C#保存一些项目 帮助器类来一般处理存储项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
公共静态类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();
});