Кэширование .Net с помощью system.runtime.caching - PullRequest
1 голос
/ 13 июля 2011

Я работаю с .net 4.0, в частности System.runtime.caching.У кого-нибудь был опыт или примеры того, как создать собственный монитор изменений?

Что я хочу сделать, так это то, что когда моя программа запускается, она имеет значение 1. Пользователь нажимает кнопку, которая увеличивает значение execount до 2, изагружает результаты в базу данныхесли execount увеличивается до 3, то я хочу сделать недействительным кеш и загрузить новые результаты в кеш для использования.

У кого-нибудь есть какие-либо предложения о том, как этого добиться?

  • У меня естьЯ работал над этим некоторое время и придумал это, но я не знаю, нахожусь ли я на правильном пути с тем, что я хочу сделать (упомянуто выше) В первую очередь потому, что ti работает неправильно.

У меня есть 4 файла класса

Cache.cs:

public static class Cache {

    public static void Add(string key, object obj, CacheItemPolicy policy) {
        ObjectCache cache = MemoryCache.Default;
        cache.Add(key, obj, policy);
    }

    public static void AddExecCount(string key, object obj) {
        Add(key, obj, new ExecCountCacheItemPolicy());
    }

    public static object Get(string key) {
        ObjectCache cache = MemoryCache.Default;
        if (cache.Contains(key) == true)
            return cache.Get(key);
        else
            return null;
    }

    public static void Clear() {
        Material.MaterialFamilyList.ClearCache();
        Material.UsageMaterialDropList.ClearCache();
    }

    /// <summary>
    /// Clears the in-memory cache so the list matching the provided key is reloaded on next request.
    /// </summary>
    /// <param name="key"></param>
    public static void Clear(string key) {
        ObjectCache cache = MemoryCache.Default;
        if (cache.Contains(key) == true)
            cache.Remove(key);
    }

}

Тогда ExecCountCacheitemPolicy.cs

 public class ExecCountCacheItemPolicy : CacheItemPolicy  {

    public ExecCountCacheItemPolicy() {
        this.ChangeMonitors.Add(new ExecCountChangeMonitor());
        //ExecCount.Increment();
    }

}

ExecCountChangeMonitor.cs

public class ExecCountChangeMonitor : CacheEntryChangeMonitor {

    private ReadOnlyCollection<String> _cacheKeys;
    private string _uniqueId;
    private string _regionName;
    private DateTimeOffset _lastModified;

    public ExecCountChangeMonitor() {

        _uniqueId = "ExecCountChangeMonitor";
        _regionName = "";
        _lastModified = DateTime.Now;
        var keys = new List<string>();
        keys.Add(ExecCount.CACHE_KEY);
        _cacheKeys = new ReadOnlyCollection<String>(keys);

        InitializationComplete();
    }

    public override string UniqueId {
        get { return _uniqueId; }
    }

    public override ReadOnlyCollection<string> CacheKeys {
        get { return _cacheKeys;  }
    }

    public override DateTimeOffset LastModified {
        get { return _lastModified; }
    }

    protected override void Dispose(bool disposing) {
        base.Dispose();
    }

    public override string RegionName {
        get { return _regionName; }
    }


}

И, наконец, ExecCount.cs

public const string CACHE_KEY = "ExecCount";

    public static int Value { 
        get {
            ObjectCache cache = MemoryCache.Default;
            if (cache.Contains(CACHE_KEY)) {
                return (int)cache.Get(CACHE_KEY);
            } else {
                return 0;
            }
        }
    }

    public static int Increment() {

        CacheItem item;
        ObjectCache cache = MemoryCache.Default;

        if (cache.Contains(CACHE_KEY)) {
            item = cache.GetCacheItem(CACHE_KEY);
        } else {
            item = new CacheItem(CACHE_KEY, 0, "");
            cache.Add(item, new CacheItemPolicy());
        }

        item.Value = (int)item.Value + 1;

        return (int)item.Value;

    }


}

Если у какого-либо органа есть какие-либо идентификаторы о том, почему это не работает, или о том, можно ли использовать другой способ для достижения того же результата?

1 Ответ

2 голосов
/ 14 ноября 2012

CacheEntryChangeMonitor используется для наблюдения за другой записью в кэш, на вашем пути используйте master cache key для мониторинга ведомого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...