He escrito mi propia clase de monitor de cambios para .Net MemoryCache. Parece que se inicializa bien, pero cuando intento agregarlo al Caché, arroja una excepción InvalidOperation "El método ya se ha invocado y solo se puede invocar una vez".Custom ChangeMonitor para .Net MemoryCache causa una excepción de operación no válida
Mi clase de cambio de monitor
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);
}
}
El código que utilizo para crear la directiva de caché y añadir el par clave/valor a la memoria caché
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);
establecimiento de la llamada inicia la excepción de operación no válido cuales es extraño, porque según la documentación de MSDN, solo arroja ArgumentNull, Argument, ArgumentOutOfRange y Excepciones no admitidas.
Estoy seguro de que debo estar cometiendo un simple error. Pero es difícil encontrar buena documentación o ejemplos sobre cómo escribir su propio monitor de cambios personalizado. Cualquier ayuda se agradece
¿Puede adjuntar un depurador, desactivar Just My Code y luego interrumpir excepciones para ver qué es la pila de llamadas para InvalidOperationException? –
El seguimiento de la pila no es muy útil. Está en System.Runtime.Caching.ChangeMonitor.NotifyOnChanged (OnChangedCallback onChangedCallback), pero no estaba en mi devolución de llamada para NotifyOnChanged, porque no se está llamando. – Keith
Aparentemente, tengo que agregar el monitor de cambios a la política DESPUÉS de agregar el elemento a la memoria caché. Si lo agrego antes, entonces obtengo la excepción. – Keith