예제 #1
0
        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);
        }
예제 #2
0
 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));
 }