4

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 を正しく理解していれば、メソッドのデリゲートは渡され、呼び出されません

これらの目標を達成するにはどうすればよいですか:

  1. キャッシュに既に存在する場合は、オブジェクト初期化子を呼び出さないでください
  2. キャッシュにない場合は、一度だけ呼び出します。
4

1 に答える 1

7

オブジェクトをキャッシュに保存しないで、Lazy.

private static T GetCachedCollection<T>(Guid cacheKey, Lazy<T> initializer)
{
    var cachedValue = (Lazy<T>)(MemoryCache.Default.AddOrGetExisting(
        cacheKey.ToString(), initializer, _policy) ?? initializer);
    return cachedValue.Value;
}
于 2014-10-23T18:21:47.100 に答える