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