2011-03-22 44 views
2

我在ASP.NET項目中實現了一個解決方案,可以根據時間自動發送一些電子郵件。我通過使用System.Runtime.Cache,特別是CacheItemRemovedCallback來完成此操作。首先,我的任務添加到高速緩存中的Application_Start方法:System.Runtime.Cache沒有過期?

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

和AddTask方法然後添加項目到緩存:

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

根據微軟:當服務器釋放系統內存時,具有此優先級的緩存項不會自動從緩存中刪除。但是,根據商品的絕對或滑動到期時間,具有此優先級的商品會與其他商品一​​起被刪除。 – Neil 2011-03-22 10:18:27