2014-10-21 78 views
0

在我的生產服務器上,我有一個使用頻繁的SQL Server實例和我的應用程序,它是一個c#Windows服務。我的服務在不同的時間運行各種工作。每24小時發送一封電子郵件,提供有關各種工作進展的最新信息。MemoryCache意外驅逐在C#

該代碼通過檢查內存緩存中的標誌來確定是否發送電子郵件。代碼如下所示: -

if (Common.MemCache.Get(Common.MemoryCacheActions.DailyEmail) == null) 
{ 
    Common.Logger.Info("Collating email data."); 
    Common.MemCache.Add(Common.MemoryCacheActions.DailyEmail, String.Empty, DateTime.Now.AddHours(24)); 

    SendEmail(); 
} 

由於我的主循環檢查每分鐘左右,我已經收到了大量電子郵件的空項。這就好像添加失敗了,或者該項目已被驅逐?

我已經閱讀過在沒有足夠內存的情況下可能會被驅逐的地方。正如在發生這種情況時發生的那樣,維護腳本在SQL Server中運行,並且盒子上的可用內存幾乎爲零。我關閉了我在服務器上運行的幾個程序,chrome,SSMS等,並且沒有更多的日誌條目或電子郵件。

由於我已明確設置項目的到期時間爲現在+ 24小時,因此我希望它可以在24小時內添加項目!

這裏有什麼解決方案,我必須將CacheItemPriority設置爲NotRemoveable,然後在24小時後手動刪除項目嗎?

這種類型打敗了我如何使用我的緩存,或將不可拆卸與AbsoluteExpirationDate協同工作?

回答

1

您可以使用

MemoryCache.CreateCacheEntryChangeMonitor()

創建CacheEntryChangeMonitor對象,可以觸發事件以響應更改指定緩存條目。

查看相關項目是否從緩存中刪除。

該方法返回一個CacheEntryChangeMonitor實例,其中的NotifyOnChanged方法用於提供緩存更改時調用的回調方法。

此外,請驗證您的服務沒有重新啓動。也許它崩潰並設置爲在崩潰時重新啓動?

0

我認爲,所描述的行爲是正確的 - 沒有任何合同或定義說該項目無法隨時從緩存中清除。

要每24小時安排一次電子郵件是恕我直言,好得多使用例如https://www.quartz-scheduler.net/或您選擇的任何其他調度庫。

這將清楚地顯示您的意圖。