간단한 설명을 고정하지 않는 것 캐시 항목 콜백 및 기타 방법에 사용 한시간 안에 만료 될 캐시 항목. 또한 캐시 항목이 만료 될 때 호출되는 콜백 메서드가 있습니다.이 메서드는 Render에서 만든 파일을 삭제합니다. Page_Init 메서드에서 Render 메서드가 디스크에 쓴 파일에 액세스하려고합니다. 이 두 메소드에는 모두 lock 문이있어 개인 정적 객체를 잠급니다.잠금 내가 생성 할 수
가 의도 : 파일을 봉사하고있는 동안
가 (또는 날짜, 내용이 많다는 점 만점) 너무 오래된지기 전에 삭제됩니다 기본적으로 디스크에 자신의 복사본을 기록하는 페이지를 만들려면, 존재하는 경우 디스크에.
관찰 된 문제 :
이것은 실제로 두 가지 문제입니다. 페이지 요청은 예상 한대로 수행되며 페이지를 디스크로 렌더링하여 즉시 제공하고 만료 항목을 캐시에 추가합니다. 테스트를 위해 만료 시간은 1 분입니다.
그런 다음 콜백 메서드가 60 초 후에 호출되고 파일을 삭제할 것으로 예상합니다. 그렇지 않습니다.
(인수의 이유로) 브라우저에서 페이지를 새로 고칩니다. 그런 다음 콜백 메소드가 호출되고 잠금 객체에 잠금을 설정하는 것을 볼 수 있습니다. Page_Init도 호출되고 동일한 객체에 잠금을 설정합니다. 그러나 두 방법 모두 잠금 코드 블록을 입력하고 실행을 계속합니다.
결과는 다음과 같습니다. 렌더 검사 파일이 있고, 콜백 메소드가 파일을 삭제하고, 렌더 메소드가 지금 삭제 된 파일을 제공하려고합니다.
끔찍 간단한 코드 추출 :
이 가public class MyPage : Page
{
private static Object lockObject = new Obect();
protected void Page_Init(...)
{
if (File.Exists(...))
{
lock (lockObject)
{
if (File.Exists(...))
{
Server.Transfer(...);
}
}
}
}
protected override void Render(...)
{
If (!File.Exists(...))
{
// write file out and serve initial copy from memory
Cache.Add(..., new CacheItemRemovedCallback(DoCacheItemRemovedCallback));
}
}
private static void DoCacheItemRemovedCallback(...)
{
lock (lockObject)
{
If (File.Exists(...))
File.Delete(...);
}
}
}
가
사람이이 제발 설명 할 수 있습니까? 나는 콜백 메서드가 본질적으로 게으르다는 것을 이해하고 요청을 한 번만 호출하기 때문에 .NET1.1의 스레딩은 두 개의 lock() 블록을 동시에 입력 할 수 없다는 것을 충분히 이해할 수 있습니까?
감사합니다.
매트.
관련 없음,하지만 :'private static Object lockObject = new Obect()'- 웹 페이지에 있습니까? 이는 * 모든 * 요청이 잠금을 공유한다는 것을 의미합니다 - 의도 한 것입니까? –
아마 내가 제대로 이해하지 못 하겠지만 OutputCache 지시문의 기능을 복제하고있는 것처럼 보입니다. http://msdn.microsoft.com/en-us/library/hdxfb6cy(VS.71).aspx – PhilPursglove
[뻔뻔스러운 침묵] 예, 그렇습니다. 사실, .NET1.1에 제공되지 않았다는 인상을 받았습니다. 나는 이제 내 머리를 찢어 버리고 그 이유와 1.1 OutputCache에 결함이 있는지 기억하려고 노력할 것입니다. 그런 다음 그것을 사용할 것입니다. 감사합니다. [더 많은 침묵] –