2011-09-12 3 views
1

적절한 성능을 얻기 위해 대규모 비즈니스 개체 컬렉션의 지속성을 요구하는 응용 프로그램 구성 요소 집합이 있습니다. 이것은 본질적으로 데이터베이스에서 읽고 나중에 재사용하기 위해 수화 된 데이터입니다.System.Runtime.Caching 디버거가 연결될 때 캐싱에 대한 "잊어 버림"

이 개체 컬렉션은 원래 .net 3.5에서 구현되었으므로 ASP.Net 런타임에서로드 할 때이 지속성을 유지하기 위해 HttpRuntime.Cache가 사용되었으며 win forms 클라이언트가 엔터프라이즈 라이브러리 캐싱 블록이 사용되었습니다.

이제 .net 4.0을 사용하면 System.Runtime.Caching을 이러한 요청에 사용할 수 있습니다. 캐시 된 항목 get에 대해 다음 패턴이 구현되었습니다.

Public Function GetCachedObject(cacheKey as String) as Object 

    Dim _returnValue as Object 

    SyncLock m_lockObject //some private lock object 

     Dim _cache as ObjectCache = MemoryCache.Default 

     //This is never found when debugging 
     If _cache.Item(cacheKey) IsNot Nothing Then 
     _returnValue = _cache.Item 
     Else 
      Dim _policy As New System.Runtime.Caching.CacheItemPolicy() 
      _policy.AbsoluteExpiration = DateTime.Now.AddHours(12) 

      Dim _obj as Object = MethodToGetAndHydrateObject() 
      _cache.Add(New CacheItem(cacheKey, _obj), _policy) 
      _returnValue = _obj 
     End If 

    End SyncLock 

    Return _returnValue 

End Function 

이것은, 을 작동하는 것 같다하지만 한 디버거 (VS2010)이 없기 때문에이를 부착.

일단 내가 디버거를 연결하면 위에서 설명한 캐시 존재 확인은 항상 아무 것도 반환하지 않습니다.

다음은 MSDN에서 캐시를 사용하는 방법을 보여줍니다. 내가 누락 된 것이 있습니까? 아니면이 예기치 않은 행동입니까?

업데이트 : 구성 요소가 ASP.net에서 호스팅 될 때 이런 현상이 발생합니다. DLL을 빌드하고, 사이트에 복사하고, 몇 단계의 실행과 그 좋은 것을 실행할 수 있습니다. 디버거를 연결하고 단계를 다시 실행하면 바로이 동작이 표시됩니다.

업데이트 2 :이 질문을 게시 한 후 잠시 후 디버거 출력 창에서 오류 세부 정보를 좀 더 얻었습니다. 이 오류 세부 사항은 this MS Connect 기사로 이어졌습니다. Remoting을 사용하여 ASP.NET 호스트 응용 프로그램을 호출 할 때 MemoryCache.Default는 스레드 정리에 대한 정리 타이머 (캐시 정리 등)를 묶는 것으로 보입니다. 스레드 컨텍스트를 더 이상 사용할 수 없으면 콜백이 실패하고 MemoryCache.Default가 다른 모든 시도에서 작동을 멈춘 것처럼 보입니다.

ExecutionContext.SuppressFlow()를 추가하면 (아래의 수정 된 예제 에서처럼)이 첨부 파일을 중지 한 것처럼 보입니다.

 Using ExecutionContext.SuppressFlow() 

      _cache = MemoryCache.Default 

    End Using 

저는 이것을 어제에 넣었습니다. 그 이후로 복숭아였습니다.

+0

은 프로젝트를 다시 작성한 후에 만 ​​표시됩니까? –

+0

@ 팀 B 제임스 - 업데이트를 참조 – StingyJack

+0

http://stackoverflow.com/questions/4557854/using-system-runtime-caching-but-when-i-go-to-retrieve-it-its-null 그것이 당신의 문제를 설명합니까? – Nikki9696

답변

0

잘 모르겠지만 캐시를 사용하는 방식이 MSDN의 예제와 조금 다르다. Set 대신 add 메서드를 호출하고있다. 여기

내가 찾은 예 : 여기

Private Sub btnGet_Click(ByVal sender As Object, ByVal e As EventArgs) 
    Dim cache As ObjectCache = MemoryCache.[Default] 
    Dim fileContents As String = TryCast(cache("filecontents"), String) 

    If fileContents Is Nothing Then 
     Dim policy As New CacheItemPolicy() 
     Dim filePaths As New List(Of String)() 
     filePaths.Add("c:\cache\example.txt") 

     policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths)) 

     ' Fetch the file contents. 
     fileContents = File.ReadAllText("c:\cache\example.txt") 

     cache.[Set]("filecontents", fileContents, policy) 
    End If 

    Label1.Text = fileContents 
End Sub 

: MemoryCache Class

당신은 또한 당신이 ASP.NET I에서, ASP.NET 응용 프로그램에서 구성 요소를 호스팅 할 때이 문제가 발생하는 것을 말한다

개인적으로는 HttpContext.Current.Cache을 사용할 것입니다. 사용하고있는 MemoryCache가 이미 사용하고있을 수 있습니다. 이전에는 사용하지 않았기 때문에 확실하지 않습니다.하지만 Set으로 설정을 변경하고 HttpContext의 것을 사용하면 어떻게 작동할까요? ? ASP.NET 응용 프로그램에서 실행 중이 아니면 null이되므로 HpptContext.Current를 확인하십시오.

주의 할 점은 디버거를 연결할 때 실제로 Cache.Add/Set 메서드를 실행합니까?

+0

HttpRuntime.Cache는 4.0의 Runtime.Caching으로 대체되었습니다. 이전에는 이것을 사용했지만 다른 호스트로 인해 모든 종류의 스위칭 로직을 작성해야했습니다. Cache.Set과 Cache.Add가 모두 실행되고 즉시 캐시 조회 (감시 창)는 캐시에 개체가 없음을 보여줍니다. – StingyJack