我正在使用C#MemoryCache来保留一些项目。
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