예제 #1
0
        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;
                    }
                }
            }
        }
예제 #2
0
        private void RemoveLinkedCacheEntries(TagEntry tagEntry)
        {
            foreach (var cachePair in tagEntry)
            {
                CacheEntry cacheEntry = cachePair.Key;

                if (_cacheEntries.Remove(cacheEntry.Key, cacheEntry))
                {
                    cacheEntry.MarkAsExpired();

                    RemoveFromAllTagEntries(cacheEntry);
                }
            }
        }
예제 #3
0
        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);
        }