public object GetData(string key) { ValidateKey(key); CacheItem cacheItemBeforeLock = null; bool lockWasSuccessful = false; do { lock (inMemoryCache.SyncRoot) { cacheItemBeforeLock = (CacheItem)inMemoryCache[key]; if (IsObjectInCache(cacheItemBeforeLock)) { CachingServiceItemReadEvent.Fire(false); return(null); } lockWasSuccessful = Monitor.TryEnter(cacheItemBeforeLock); } if (lockWasSuccessful == false) { Thread.Sleep(0); } } while (lockWasSuccessful == false); try { if (cacheItemBeforeLock.HasExpired()) { cacheItemBeforeLock.TouchedByUserAction(true); backingStore.Remove(key); // Does exception safety matter here? We're removing it due to expiration or scavenging... inMemoryCache.Remove(key); RefreshActionInvoker.InvokeRefreshAction(cacheItemBeforeLock, CacheItemRemovedReason.Expired); CachingServiceItemReadEvent.Fire(false); CachingServiceItemTurnoverEvent.FireRemoveItems(1); CachingServiceItemTurnoverEvent.SetItemsTotal(inMemoryCache.Count); return(null); } backingStore.UpdateLastAccessedTime(cacheItemBeforeLock.Key, DateTime.Now); // Does exception safety matter here? cacheItemBeforeLock.TouchedByUserAction(false); CachingServiceItemReadEvent.Fire(true); return(cacheItemBeforeLock.Value); } finally { Monitor.Exit(cacheItemBeforeLock); } }
private void FireCacheMissCounter() { CachingServiceItemReadEvent.Fire(false); }
private void FireCacheHitCounter() { CachingServiceItemReadEvent.Fire(true); }