Я написал свой собственный класс монитора изменений для .NET MemoryCache. Кажется, он инициализируется нормально, но когда я пытаюсь добавить его в кеш, он выдает исключение InvalidOperation
- The method has already been invoked, and can only be invoked once.
Мой класс монитора изменений:
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);
Вызов Set
выдает исключение недопустимой операции, что странно, поскольку, согласно документации MSDN, он выдает только исключения ArgumentNull
, Argument
, ArgumentOutOfRange
и NotSupported
.
Я уверен, что совершаю простую ошибку. Но трудно найти хорошую документацию или примеры по написанию собственного монитора изменений. Любая помощь будет оценена по достоинству.