自我更新MemoryCache

我已经实现了一个缓存,当它们到期时更新包含值。

我的代码是这样的:

class MyCache { private static readonly MemoryCache Cache = MemoryCache.Default; private CacheItemPolicy _errorpolicy; private CacheItemPolicy _warnPolicy; private CacheEntryRemovedCallback _warnCacheEntryRemovedCallback; private CacheEntryRemovedCallback _errorCacheEntryRemovedCallback; public void AddErrors(string key, object errors) { _errorCacheEntryRemovedCallback = ErrorItemRemovedCallback; _errorpolicy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(7.00), RemovedCallback = _errorCacheEntryRemovedCallback }; Cache.Set(key, errors, _errorpolicy); } public void AddWarnings(string key, object warnings) { _warnCacheEntryRemovedCallback = WarningCacheItemRemovedCallback; _warnPolicy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(4.00), RemovedCallback = _warnCacheEntryRemovedCallback }; Cache.Set(key, warnings, _warnPolicy); } private void ErrorItemRemovedCallback(CacheEntryRemovedArguments arguments) { Console.WriteLine("{0} Item removed: {1}", DateTime.UtcNow, arguments.CacheItem.Key); Cache.Set(arguments.CacheItem.Key, new List { "error1", "error2", "error3" }, _errorpolicy); } private void WarningCacheItemRemovedCallback(CacheEntryRemovedArguments arguments) { Console.WriteLine("{0} Item removed: {1}", DateTime.UtcNow, arguments.CacheItem.Key); Cache.Set(arguments.CacheItem.Key, new List { "warn1", "warn2", "warn3" }, _warnPolicy); } } 

但有些事情是错的。

以上内容在提示中写道:

 04-05-2014 21:20:00 Item removed: warn 04-05-2014 21:20:00 Item removed: error 04-05-2014 21:20:20 Item removed: error 04-05-2014 21:20:20 Item removed: warn 04-05-2014 21:20:40 Item removed: warn 04-05-2014 21:20:40 Item removed: error 04-05-2014 21:20:40 Item removed: error 04-05-2014 21:20:40 Item removed: warn 

……我本来希望有类似的东西

 04-05-2014 21:20:04 Item removed: warn 04-05-2014 21:20:07 Item removed: error 04-05-2014 21:20:08 Item removed: warn 04-05-2014 21:20:12 Item removed: warn 04-05-2014 21:20:14 Item removed: error ... 

我错过了什么?

更新2014-05-14:

我已将字段级变量更改为局部变量 – 但存在相同的行为。 另请注意,从缓存中删除的顺序会改变 – 首先是“error-then-warns” – 但下次是“warns-then-errors”。

另请注意,第一次从缓存中删除是在21秒之后 – 之后每隔20秒就会不断发生。

 14-05-2014 13:00:59 Adding errors to cache 14-05-2014 13:00:59 Adding warnings to cache Press 'q' to quit 14-05-2014 13:01:20 Item removed: warn 14-05-2014 13:01:20 Item removed: error 14-05-2014 13:01:40 Item removed: error 14-05-2014 13:01:40 Item removed: warn 14-05-2014 13:02:00 Item removed: warn 14-05-2014 13:02:00 Item removed: error 14-05-2014 13:02:20 Item removed: error 14-05-2014 13:02:20 Item removed: warn 14-05-2014 13:02:40 Item removed: warn 14-05-2014 13:02:40 Item removed: error 

我的全部(新代码)在这里:

 namespace DemoCache { internal class Program { private static readonly List ErrorList = new List {"error1", "error2", "error3"}; private static readonly List WarningList = new List {"warn1", "warn2", "warn3"}; static void Main() { var myCache = new MyCache(); Console.WriteLine("{0} Adding errors to cache ", DateTime.UtcNow); myCache.AddErrors("error", ErrorList); Console.WriteLine("{0} Adding warnings to cache", DateTime.UtcNow); myCache.AddWarnings("warn", WarningList); Console.WriteLine("Press 'q' to quit"); var keepRunning = true; do { var key = Console.ReadKey(true); switch (Char.ToLower(key.KeyChar)) { case 'q': keepRunning = false; break; } } while (keepRunning); } } class MyCache { private static readonly MemoryCache Cache = new MemoryCache("name"); //private CacheItemPolicy _errorpolicy; //private CacheItemPolicy _warnPolicy; //private CacheEntryRemovedCallback _warnCacheEntryRemovedCallback; //private CacheEntryRemovedCallback _errorCacheEntryRemovedCallback; public void AddErrors(string key, object errors) { CacheEntryRemovedCallback errorCacheEntryRemovedCallback = ErrorItemRemovedCallback; var errorpolicy = new CacheItemPolicy { AbsoluteExpiration = DateTime.Now.AddSeconds(7.00), RemovedCallback = errorCacheEntryRemovedCallback }; Cache.Set(key, errors, errorpolicy); } public void AddWarnings(string key, object warnings) { CacheEntryRemovedCallback warnCacheEntryRemovedCallback = WarningCacheItemRemovedCallback; var warnPolicy = new CacheItemPolicy { AbsoluteExpiration = DateTime.Now.AddSeconds(11.00), RemovedCallback = warnCacheEntryRemovedCallback }; Cache.Set(key, warnings, warnPolicy); } private void ErrorItemRemovedCallback(CacheEntryRemovedArguments arguments) { Console.WriteLine("{0} Item removed: {1}", DateTime.UtcNow, arguments.CacheItem.Key); AddErrors(arguments.CacheItem.Key, new List { "error1", "error2", "error3" }); //Cache.Set(arguments.CacheItem.Key, , _errorpolicy); } private void WarningCacheItemRemovedCallback(CacheEntryRemovedArguments arguments) { Console.WriteLine("{0} Item removed: {1}", DateTime.UtcNow, arguments.CacheItem.Key); AddWarnings(arguments.CacheItem.Key, new List { "warn1", "warn2", "warn3" }); //Cache.Set(arguments.CacheItem.Key, new List { "warn1", "warn2", "warn3" }, _warnPolicy); } } }