internal async Task EnsureConfigurationAsync() { if (_configuration != null) { return; } await _semaphore.WaitAsync(); try { if (_configuration != null) { return; } var providers = new List <IConfigurationProvider>(); if (_configBuilderFactory != null) { providers.AddRange(new ConfigurationBuilder() .AddConfiguration((await _configBuilderFactory.Invoke(_name)).Build()) .Build().Providers); } if (_configurationProviders != null) { providers.AddRange(_configurationProviders); } _updatableData = new UpdatableDataProvider(_initialData ?? Enumerable.Empty <KeyValuePair <string, string> >()); providers.Add(_updatableData); _configuration = new ConfigurationRoot(providers); } finally { _semaphore.Release(); } }