public virtual async Task <T> GetOrAddAsync <T>(string key, Func <ICacheEntry, Task <T> > addItemFactory) { ValidateKey(key); T cacheItem; await _lock.WaitAsync().ConfigureAwait(false); try { cacheItem = await CacheProvider.GetOrCreateAsync <T>(key, async (entry) => { // thread safety is up to the provider var result = await addItemFactory(entry); EnsureEvictionCallbackDoesNotReturnTheAsyncOrLazy <T>(entry.PostEvictionCallbacks); return(result); }); } finally { _lock.Release(); } return(cacheItem); }
protected async Task <TModel> GetOrCreateCacheItemAsync <TModel, TKey>(TKey id, Func <TKey, CacheItem, Task <TModel> > factory, DateTimeOffset?absoluteExpiration = null) where TModel : IModelKey <TKey> { return(await CacheProvider.GetOrCreateAsync(id, factory, absoluteExpiration)); }