2012-02-24 5 views
7

배경 : ASP.NET MVC 3 웹 응용 프로그램을 작성하고 있습니다. 편리한 자동 만료 기능 및 스레드 안전성으로 인해 캐시에 보관하려는 객체의 List<MyObject> (실제로 여러 목록)이 있습니다.System.Web.Caching.Cache 캐시에서 제거 된 개체를 삭제 하시겠습니까?

내부 개체에는 내부 서버 푸시 구현에 사용되는 System.Threading.Semaphore의 인스턴스가 내부적으로 포함되어 있습니다.

그래서 캐시에 넣으면 개체의 수명주기가 어떻게 변경 될지 궁금합니다. 캐시가/etc를 제거하는 객체를 실제로 처리하면 스레드/NullReferenceExceptions에 문제가 발생할 수 있습니다. 아마도 이것을하지 않는 다른 명백한 이유가 있을까요?

TIA.

답변

9

캐시는 어떤 이유로 든 캐시에서 배출 될 때 명시 적으로 개체를 처리하지 않습니다. 당신은 그것을 테스트하여이를 증명할 수 있지만,이 경우라면이 문서에있을 것, 그것은되지 않습니다 :

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

캐시에있는 객체의 라이프 사이클에있는에 의해 연장 될 수있다 캐시는 캐시를 참조하기 때문에 이 문제를 피하려면 약한 참조를 대신 캐시 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

이 캐시에 대한 참조를 저장하는 더 라이프 사이클에 미치는 영향이 없어야 할 경우.

한가지 생각해보십시오. 스레드 안전성 때문에 캐시를 사용하고 싶다고 말하면됩니다. 캐시 개체 자체는 스레드로부터 안전하지만 캐시되지 않은 개체를 자동으로 스레드로부터 안전하게 보호하지 않는 캐시되지 않은 개체를 캐시에 캐시하는 경우주의해야합니다. 특히 List<T>은 스레드로부터 안전하지 않으며 캐시에 저장하면 변경되지 않습니다. 스레드 안전을 보장하려면 동시 콜렉션을 사용하십시오.

+0

답변 해 주셔서 감사합니다. 이제 좀 더 편안해졌습니다. 나는 라이프 사이클을 연장하는 것을 꺼리지 않는다 - 이것은 나에게이 솔루션을위한 포인트를 추가 할 수도있다. 가장 가까운 미래에 응답이 더 이상 나타나지 않으면 귀하의 대답을 수락합니다. –

+3

제거 콜백 메소드를 지정하여 필요한 경우 오브젝트를 삭제할 수 있습니다. – Rozwel

+0

@Rozwel : 감사합니다. 객체가 자동으로 제거되지 않는다는 것을 확실히 알고 싶었습니다. –

관련 문제