.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);
MSDN のドキュメントによると、例外、、、、および例外Set
のみがスローされるため、この呼び出しは無効な操作の例外をスローします。ArgumentNull
Argument
ArgumentOutOfRange
NotSupported
私は単純な間違いを犯しているに違いないと確信しています。しかし、独自のカスタム変更モニターの作成に関する優れたドキュメントや例を見つけるのは困難です。どんな助けでも大歓迎です。