private async Task <TValue> FetchAndAddToCache <TValue>( string key, Func <string, Task <TValue> > fetchFactory) { using (await _cacheLock.LockAsync(key).ConfigureAwait(false)) { var result = await Provider.TryGet <TValue>(key).ConfigureAwait(false); if (result.Succeeded) { return(result.Value); } TValue value = await fetchFactory(key).ConfigureAwait(false); await Provider.Set(key, value).ConfigureAwait(false); return(value); } }