Пример #1
0
        public SrvLookup <TService> GetOrAdd(string serviceName, SrvLookupFunction <TService> lookupFunc)
        {
            // ReSharper disable once InlineOutVariableDeclaration
            SrvLookup <TService> result;

            // ReSharper disable once InconsistentlySynchronizedField
            if (_bag.TryGetValue(serviceName, out result) && (result != null))
            {
                return(result);
            }

            lock (_syncLock)
            {
                if (_bag.TryGetValue(serviceName, out result) && (result != null))
                {
                    return(result);
                }

                result            = lookupFunc(serviceName);
                _bag[serviceName] = result;

                // fire update event
                Updated?.Invoke(this, new ServiceCacheUpdateEventArgs {
                    DnsName = serviceName
                });

                return(result);
            }
        }
Пример #2
0
        public SrvLookup <TService> CheckAndUpdate(string serviceName, SrvLookup <TService> oldValue, SrvLookupFunction <TService> lookupFunc)
        {
            lock (_syncLock)
            {
                // ReSharper disable once InlineOutVariableDeclaration
                SrvLookup <TService> result;

                // if already updated
                if (_bag.TryGetValue(serviceName, out result) && (!ReferenceEquals(result, oldValue)))
                {
                    return(result);
                }

                result            = lookupFunc(serviceName);
                _bag[serviceName] = result;

                // fire updated event
                Updated?.Invoke(this, new ServiceCacheUpdateEventArgs {
                    DnsName = serviceName
                });

                return(result);
            }
        }