2011-03-22 2 views
2

ASP.NET 프로젝트에서 시간에 따라 자동으로 이메일을 보내는 솔루션을 구현했습니다. System.Runtime.Cache, 특히 CacheItemRemovedCallback을 사용하여이 작업을 수행했습니다.System.Runtime.Cache가 만료되지 않습니까?

protected void Application_Start(object sender, EventArgs e) 
{ 
    ... 
    AddTask(reportElement.name, totalMinutes); 
    ... 
} 

과 AddTask 방법은 캐시에 항목을 추가합니다 : 우선 나는 위해 Application_Start 메서드에서 캐시에 작업을 추가

private void AddTask(string name, int minutes) 
{ 
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); 
    HttpRuntime.Cache.Insert(name, minutes, null, DateTime.Now.AddMinutes(minutes),  Cache.NoSlidingExpiration, 
      CacheItemPriority.NotRemovable, OnCacheRemove); 
} 

그래서 캐시 항목이 분 만료 AbsolutionExpiration에 지정된 경우 CacheItemRemoved 메서드를 호출합니다. 이것은 기본적으로 보고서를 실행하고 전자 메일을 보낸 다음 캐시에 작업을 다시 추가하므로 시간이 만료 된 후에 다시 실행됩니다 - 간단합니다. 다음은 CacheItemRemoved에서 고려중인 코드의 일부입니다.

public void CacheItemRemoved(string taskName, object minutes, CacheItemRemovedReason r) 
{ 
    ... 
    finally 
    { 
     AddTask(taskName, Convert.ToInt32(minutes)); 
    } 
    ... 
} 

가 당신이 작업의 다시 추가 볼 수 finally 블록에있는 코드에서 예외 처리, 그래서 항상 전화를받을 것이다. 그리고 모든 예외 catch 블록은 파일에 오류를 기록합니다. 이전 오류가 발생하더라도 작업을 계속 실행하고 싶습니다.

로컬 컴퓨터에서는 완벽하게 작동하지만 Windows Server 2003에서는 기본적으로 한 번만 실행됩니다. 추가 디버깅을 추가했으며 두 번째로 캐시 항목이 추가 된 것처럼 보입니다. 만료되지 않습니다. 나는 지금 완전히 붙어있다. Windows 서버에서 IIS 6.0을 실행 중입니다. 내가 모르는 캐시에 대한 설정이 있습니까? 또한 서버에서는 분 단위로 지정된 시간과 완전히 다른 시간에 만료되는 것처럼 보입니다.

미리 감사드립니다.

답변

1
HttpRuntime.Cache.Insert(name, minutes, null, DateTime.Now.AddMinutes(minutes),  Cache.NoSlidingExpiration, 
      CacheItemPriority.NotRemovable, OnCacheRemove); 

당신이 (당신이 메모리가 부족하지 않는 한) 반드시이 이제까지 제거되는 항목을 방지 할 수 있습니다, CacheItemPriority.NotRemovable를 지정하는 이유는 캐시 항목을 추가합니다.

+2

Microsoft에 따르면이 우선 순위 수준의 캐시 항목은 서버가 시스템 메모리를 해제 할 때 캐시에서 자동으로 삭제되지 않습니다. 그러나이 우선 순위 수준의 항목은 항목의 절대 또는 슬라이딩 만료 시간에 따라 다른 항목과 함께 제거됩니다. – Neil

관련 문제