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(); } }