Я работаю с .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;
}
}
Если у какого-либо органа есть какие-либо идентификаторы о том, почему это не работает, или о том, можно ли использовать другой способ для достижения того же результата?