自定义ChangeMonitor for .Net MemoryCache导致无效的操作异常

Kei*_*ith 8 .net c# invalidoperationexception

我为.Net MemoryCache编写了自己的自定义更改监视器类.它似乎初始化很好,但是当我尝试将它添加到Cache时,它会抛出一个InvalidOperation异常"该方法已经被调用,并且只能被调用一次."

我的更改监视器类

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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

我用来创建缓存策略并将密钥/值对添加到缓存的代码

        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);
Run Code Online (Sandbox Code Playgroud)

Set调用抛出了无效的操作异常,这很奇怪,因为根据MSDN文档,它只抛出ArgumentNull,Argument,ArgumentOutOfRange和NotSupported Exceptions.

我相信我一定是犯了一个简单的错误.但很难找到关于编写自己的自定义更改监视器的好文档或示例.任何帮助,将不胜感激

EBa*_*arr 6

我知道评论有答案,但我希望它更明显......

使用a时ChangeMonitor,如果缓存条目不存在,它将立即触发.
MSDN 文档以这种方式说明:

由于以下任何原因,监视的条目被视为已更改:

A)在调用 CreateCacheEntryChangeMonitor方法时,密钥不存在.在这种情况下,生成的CacheEntryChangeMonitor实例立即设置为已更改状态.这意味着当代码随后绑定更改通知回调时,会立即触发回调.

B)从缓存中删除了相关的缓存条目.如果明确删除了条目,如果它已过期,或者它被驱逐以恢复内存,则会发生这种情况