我在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。有沒有我不知道的緩存設置。另外,在服務器上,它似乎在完全不同的時間到達分鐘中指定的時間。
在此先感謝。
根據微軟:當服務器釋放系統內存時,具有此優先級的緩存項不會自動從緩存中刪除。但是,根據商品的絕對或滑動到期時間,具有此優先級的商品會與其他商品一起被刪除。 – Neil 2011-03-22 10:18:27