9

.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のみがスローされるため、この呼び出しは無効な操作の例外をスローします。ArgumentNullArgumentArgumentOutOfRangeNotSupported

私は単純な間違いを犯しているに違いないと確信しています。しかし、独自のカスタム変更モニターの作成に関する優れたドキュメントや例を見つけるのは困難です。どんな助けでも大歓迎です。

4

3 に答える 3

6

コメントに答えがあることは知っていますが、もっと明白にしたかったのです...

aChangeMonitorを使用すると、キャッシュ エントリが存在しない場合にすぐに起動します。
MSDNのドキュメントには、次のように記載されています

監視対象のエントリは、次のいずれかの理由で変更されたと見なされます。

A) CreateCacheEntryChangeMonitor メソッドの呼び出し時にキーが存在しません。その場合、結果の CacheEntryChangeMonitor インスタンスはすぐに変更された状態に設定されます。これは、コードが後で変更通知コールバックをバインドすると、コールバックがすぐにトリガーされることを意味します。

B) 関連するキャッシュ エントリがキャッシュから削除された。これは、エントリが明示的に削除された場合、有効期限が切れた場合、またはメモリを回復するために削除された場合に発生する可能性があります

于 2012-08-24T16:21:13.820 に答える