2014-10-23 6 views
4

MemoryCache 클래스는 존재하는 경우 얻을 수있는 스레드 안전 방법 인 .AddOrGetExisting이라는 메서드를 노출하고, 존재하지 않는 경우 추가합니다.불필요하게 캐싱 될 객체를 인스턴스화하지 않고 MemoryCache를 채우는 방법은 무엇입니까?

캐시 된 개체가없는 경우이 메서드는 NULL을 반환합니다. 캐시의 존재에 관해 사용자에게 피드백을 제공하기 때문에이 값을 이해한다고 생각합니다.

내 캐시 해결은 다음과 같습니다

private static T GetCachedCollection<T>(Guid cacheKey, Lazy<T> initializer) 
{ 
    return (T) (MemoryCache.Default.AddOrGetExisting(cacheKey.ToString(), initializer.Value, _policy) ?? initializer.Value); 
} 

무엇을 달성하려고하는 것은이 필요하지 않은 오브젝트가 작성되지 않는 것입니다, 그리고 필요한 경우 내가 두 번을 구성하고 싶지 않아 .

내가 가진 Lazy 유형의 .Value을 매개 변수로 전달하면 해당 항목이 캐시에 있는지 여부에 관계없이 초기화 프로그램을 호출 할 수 있습니다. 그러나 JIT를 제대로 이해하면 메서드의 대리자를 전달하고 이 아닌이 호출됩니다.

어떻게 이러한 목표를 달성해야 그 다음 한 번만 그것을 호출하는 캐시에없는 경우 이미 캐시에

  • 을 존재하는 경우
    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; 
    } 
    
    +0

    브릴리언트. 어떻게 내가 그것을 간과하는지 명확히하지 않는다! – Matthew