我寫我自己的自定義更改監視器類爲.NET的MemoryCache。它似乎初始化很好,但是當我試圖將它添加到Cache時,它會拋出一個InvalidOperation異常「該方法已經被調用,並且只能被調用一次。」定製ChangeMonitor對於.NET的MemoryCache導致無效操作異常
我更改監視器類
internal class MyChangeMonitor : ChangeMonitor
{
private Timer _timer;
private readonly string _uniqueId;
private readonly TypeAsOf _typeAsOf;
private readonly string _tableName;
public GprsChangeMonitor(TypeAsOf typeAsOf, string tableName)
{
bool initComplete = false;
try
{
_typeAsOf = typeAsOf;
_tableName = tableName;
_uniqueId = Guid.NewGuid().ToString();
TimeSpan ts = new TimeSpan(0, 0, 5, 0, 0);
_timer = new Timer {Interval = ts.TotalMilliseconds};
_timer.Elapsed += CheckForChanges;
_timer.Enabled = true;
_timer.Start();
initComplete = true;
}
finally
{
base.InitializationComplete();
if(!initComplete)
Dispose(true);
}
}
void CheckForChanges(object sender, System.Timers.ElapsedEventArgs e)
{
//check for changes, if different
base.OnChanged(_typeAsOf);
}
}
我用它來創建高速緩存策略和鍵/值對添加到緩存
CacheItemPolicy policy = new CacheItemPolicy
{
UpdateCallback = OnCacheEntryUpdateCallback
};
policy.AbsoluteExpiration = SystemTime.Today.AddHours(24);
//monitor the for changes
string tableName = QuickRefreshItems[type];
MyChangeMonitor cm = new MyChangeMonitor(typeAsOf, tableName);
policy.ChangeMonitors.Add(cm);
cm.NotifyOnChanged(OnRefreshQuickLoadCacheItems);
MyCache.Set(cacheKey, value, policy);
的集調用的代碼引發無效操作異常,其很奇怪,因爲根據MSDN文檔,它只會拋出ArgumentNull,Argument,ArgumentOutOfRange和NotSupported Exceptions。
我相信,我必須做一個簡單的錯誤。但是在編寫自己的自定義更改監視器時很難找到很好的文檔或示例。任何幫助,將不勝感激
可以附加一個調試器,關閉僅我的代碼,然後在例外打破看到調用堆棧是什麼的出現InvalidOperationException? – 2011-04-01 23:13:25
堆棧跟蹤不是很有幫助。它在System.Runtime.Caching.ChangeMonitor.NotifyOnChanged(OnChangedCallback onChangedCallback)中,但它不在NotifyOnChanged的回調中,因爲它沒有被調用。 – Keith 2011-04-04 12:16:47
顯然,我必須在將項目添加到緩存後將更改監視器添加到策略中。如果我之前添加它,那麼我會得到異常。 – Keith 2011-04-04 12:34:29