private void AddToTagEntries(CacheEntry cacheEntry) { if (cacheEntry.Tags != null) { var tagEntries = new List <TagEntry>(cacheEntry.Tags.Length); foreach (object tag in cacheEntry.Tags) { TagEntry tagEntry = _tagEntries.GetOrAdd(tag, _ => new TagEntry(cacheEntry)); tagEntry.TryAdd(cacheEntry, 0); tagEntries.Add(tagEntry); if (cacheEntry.IsExpired || tagEntry.IsRemoved) { if (_cacheEntries.Remove(cacheEntry.Key, cacheEntry)) { cacheEntry.MarkAsExpired(); } RemoveFromTagEntries(tagEntries, cacheEntry); return; } } } }
private void RemoveLinkedCacheEntries(TagEntry tagEntry) { foreach (var cachePair in tagEntry) { CacheEntry cacheEntry = cachePair.Key; if (_cacheEntries.Remove(cacheEntry.Key, cacheEntry)) { cacheEntry.MarkAsExpired(); RemoveFromAllTagEntries(cacheEntry); } } }
private static void ScanForExpiredEntries(MemoryCache cache) { DateTime utcNow = DateTime.UtcNow; foreach (var cachePair in cache._cacheEntries) { object key = cachePair.Key; CacheEntry cacheEntry = cachePair.Value; if (cacheEntry.CheckIfExpired(utcNow)) { if (cache._cacheEntries.Remove(key, cacheEntry)) { cache.RemoveFromAllTagEntries(cacheEntry); } } } foreach (var tagPair in cache._tagEntries) { object tag = tagPair.Key; TagEntry tagEntry = tagPair.Value; if (tagEntry.IsEmpty) { if (cache._tagEntries.Remove(tag, tagEntry)) { tagEntry.MarkAsRemoved(); cache.RemoveLinkedCacheEntries(tagEntry); } } } Volatile.Write(ref cache._cleanupIsRunning, 0); }