public async Task <T> GetOrCreate(string inputKey, Func <Task <T> > createItem) { var key = _scopeProvider.ApplyCurrentScope(inputKey); T cacheEntry; if (_cache.TryGetValue(key, out cacheEntry)) { return(cacheEntry); } var creationLock = await AcquireCacheEntryCreationLock(key); try { if (!_cache.TryGetValue(key, out cacheEntry)) { cacheEntry = await createItem(); _cache.Set(key, cacheEntry, DateTimeOffset.Now.Add(_cacheDuration)); } } finally { creationLock.Release(); } return(cacheEntry); }