問題就迎刃而解了:
這是一個獨特而有趣的問題,所以我要在這裏記錄的原因和解決方案作爲一個答案,以供將來搜索。
我在我的問題中遺漏的一點是,這個緩存插入發生在實現單例模式的服務類中。
一言以蔽之:
public class Service
{
private static readonly Service _Instance = new Service();
static Service() { }
private Service() { }
public static Service Instance
{
get { return _Instance; }
}
// The expensive data that this service exposes
private someObject _data = null;
public someObject Data
{
get
{
if (_data == null)
loadData();
return _data;
}
}
private void loadData()
{
_data = GetFromCache();
if (_data == null)
{
// Get the data from our datasource
_data = ExpensiveDataSourceGet();
// Insert into Cache
HttpContext.Current.Cache.Insert(etc);
}
}
}
可能明顯一些,但這裏的罪魁禍首是Singleton模式中延遲加載。我很想到緩存沒有失效,我忘記了只要工作進程還活着,單例狀態就會一直存在。
Cache.Insert有一個重載,允許您指定一個事件處理程序,用於何時移除緩存項目,我的第一個測試是創建一個虛擬處理程序並在其中設置一個斷點。一旦我看到緩存被清除,我意識到「_data」沒有被重置爲null,所以下一個對單例的請求加載了延遲加載的值。
從某種意義上說,我是雙緩存,雖然單身緩存非常短暫,但長得足以令人討厭。
解決方案?
HttpContext.Current.Cache.Insert(
"Key",
SomeObject,
new CacheDependency(Server.MapPath("SomeFile.txt")),
DateTime.MaxValue,
TimeSpan.Zero,
CacheItemPriority.High,
delegate(string key, object value, CacheItemRemovedReason reason)
{
_data = null;
}
);
當緩存被清除時,單例中的狀態也必須被清除......問題解決了。
在這裏學到了什麼?不要將狀態置於單身狀態。
什麼是ObjectFile?一個字符串? – 2009-04-29 23:58:15
我編輯,使其更加明顯。 – FlySwat 2009-04-29 23:59:35