Esempio n. 1
0
        public void NotifyUpdated(IEnumerable <string> identifiers)
        {
            if (!(identifiers?.Any() ?? false))
            {
                return;
            }

            _cacheLock.EnterWriteLock();
            try
            {
                // rebuild items anyway
                var lstIdentifiers = identifiers.ToList();
                var updatedItems   = _cacheProvider.RebuildItems(lstIdentifiers);

                var cache = MemoryCache.Default;

                if (!(cache[_cacheKey] is IDictionary <string, T> data))
                {
                    return; // nothing to update, cache will be read when next time requested;
                }
                if (!(_cacheProvider is IPersistentCacheProviderEx <T> _cacheProviderWithDelta))
                {
                    ApplyDelta(data, lstIdentifiers, updatedItems);
                    return;
                }

                var lastUpdate = cache[_cacheUpdateNumberKey] as long?;
                var(replacedItemsIdentifiers, newItems, lastChange) = _cacheProviderWithDelta.GetDelta(lastUpdate);

                ApplyDelta(data, replacedItemsIdentifiers, newItems);
                SetCache(cache, lastChange);
            }
            finally
            {
                _cacheLock.ExitWriteLock();
            }
        }