MemoryCacheクラスは、存在する場合は取得し、存在しない場合は追加するスレッドセーフな方法である.AddOrGetExistingというメソッドを公開します。
このメソッドはNULL
、キャッシュされたオブジェクトがまだ存在しない場合に戻ります。キャッシュ内の存在に関するフィードバックをユーザーに提供するため、これの価値を理解していると思います。
私のキャッシュ リゾルバーは次のようになります。
private static T GetCachedCollection<T>(Guid cacheKey, Lazy<T> initializer)
{
return (T) (MemoryCache.Default.AddOrGetExisting(cacheKey.ToString(), initializer.Value, _policy) ?? initializer.Value);
}
私が達成しようとしているのは、オブジェクトが必要でない限り作成されず、必要な場合は 2 回作成したくないということです。
私が懸念しているのは.Value
、自分のLazy
型の をパラメーターとして渡すと、アイテムがキャッシュにあるかどうかに関係なく、初期化子が呼び出される可能性があることです。ただし、JIT を正しく理解していれば、メソッドのデリゲートは渡され、呼び出されません。
これらの目標を達成するにはどうすればよいですか:
- キャッシュに既に存在する場合は、オブジェクト初期化子を呼び出さないでください
- キャッシュにない場合は、一度だけ呼び出します。