적절한 성능을 얻기 위해 대규모 비즈니스 개체 컬렉션의 지속성을 요구하는 응용 프로그램 구성 요소 집합이 있습니다. 이것은 본질적으로 데이터베이스에서 읽고 나중에 재사용하기 위해 수화 된 데이터입니다.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
저는 이것을 어제에 넣었습니다. 그 이후로 복숭아였습니다.
은 프로젝트를 다시 작성한 후에 만 표시됩니까? –
@ 팀 B 제임스 - 업데이트를 참조 – StingyJack
http://stackoverflow.com/questions/4557854/using-system-runtime-caching-but-when-i-go-to-retrieve-it-its-null 그것이 당신의 문제를 설명합니까? – Nikki9696