我正在使用.NET 4.0MemoryCache http://msdn.microsoft.com/en-us/library/dd780634%28v=vs.100%29.aspx类,并且我想以线程安全的方式添加或替换缓存中的现有项目,但我也想知道我是否替换了现有项目或添加了新项目。
据我所知,Set http://msdn.microsoft.com/en-us/library/ee395903%28v=vs.100%29.aspx方法的目的是原子地替换缓存中的项目(如果存在),而AddOrGetExisting http://msdn.microsoft.com/en-us/library/ee395901%28v=vs.100%29.aspx方法将自动获取现有项目而不替换它。
但是,Set 方法不会返回被替换的项目,而只是替换它。可以将已删除的事件连接到CacheItemPolicy http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy%28v=vs.100%29.aspx的项目,但很难将其与取代它的新项目相匹配。
我可以用下面的方法来近似它,但它看起来有点重(因为要求缓存实质上添加一个项目两次),我想问是否有人知道更简单的方法来做到这一点。
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;
}
}