.NET 4.0MemoryCacheクラスを使用しており、キャッシュ内の既存のアイテムをスレッド セーフな方法で追加または置換したいのですが、既存のアイテムを置換したか、新しいアイテムを追加したかどうかも知りたいです。
私が知る限り、このSetメソッドは、キャッシュ内のアイテムが存在する場合にそれをアトミックに置き換えることを目的としていますが、AddOrGetExistingメソッドは既存のアイテムを置き換えずにアトミックに取得します。
ただし、Set メソッドは、置き換えられた項目を返すのではなく、置き換えるだけです。削除されたイベントをCacheItemPolicyfor アイテムに接続することは可能ですが、それを置き換えた新しいアイテムと一致させるのは困難です。
次の方法で概算できますが、少し重いようです (基本的にアイテムを 2 回追加するようにキャッシュに要求するため)。
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;
}
}