我正在使用 .NET 4.0MemoryCache
类,我想以线程安全的方式添加或替换缓存中的现有项目,但我也想知道我是替换了现有项目还是添加了新项目。
据我所知,该Set
方法旨在以原子方式替换缓存中的项目(如果存在),而该AddOrGetExisting
方法将以原子方式获取现有项目而不替换它。
但是,Set 方法不会返回被替换的项目,它只是替换它。可以将已删除的事件与 for 项目挂钩CacheItemPolicy
,但很难将其与替换它的新项目匹配。
我可以用下面的方法来近似它,但它似乎有点重(因为要求缓存基本上添加一个项目两次),我想问是否有人知道更简单的方法来做到这一点。
public object SetAndGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null)
{
lock (_cacheLock)
{
var existing = _cache.AddOrGetExisting(key, value, policy, regionName);
if (existing != null)
{
_cache.Set(key, value, policy, regionName);
return existing;
}
return null;
}
}