/// <inheritdoc />> public async Task <T> GetCachedDataAsync(Func <CancellationToken, Task <T> > dataGetter, string key, RefreshBehaviour refreshBehaviour, CancellationToken cancellationToken, NotInCacheBehaviour notInCacheBehaviour) { (bool, object)memoryWrappedResult = _pollySyncCacheProvider.TryGet(key); bool isObjectInMemoryCache = memoryWrappedResult.Item1; if (isObjectInMemoryCache) { CachedItemWrapper <T> memoryResultObject = (CachedItemWrapper <T>)memoryWrappedResult.Item2; bool isMemoryCacheFresh = IsFresh(memoryResultObject); if (!isMemoryCacheFresh) { if (refreshBehaviour == RefreshBehaviour.WaitForFreshData) { return(await _collapserPolicy.ExecuteAsync(async() => await RecacheItemInMemoryAndDistCacheAsync(dataGetter, key, cancellationToken, _whenDataIsStaleDelegate))); } else if (refreshBehaviour == RefreshBehaviour.DontWaitForFreshData) { #pragma warning disable 4014 Task.Factory.StartNew(async() => await RecacheItemInMemoryAndDistCacheAsync(dataGetter, key, cancellationToken, _whenDataIsStaleDelegate), cancellationToken); #pragma warning restore 4014 } } return(memoryResultObject.Content); } else { (bool, object)distributedCacheWrappedResult = await _distributedCacheWrapper.TryGetAsync <CachedItemWrapper <T> >(key, cancellationToken, false); bool isObjectInDistributedCache = distributedCacheWrappedResult.Item1; if (isObjectInDistributedCache) { CachedItemWrapper <T> distributedCacheObject = (CachedItemWrapper <T>)distributedCacheWrappedResult.Item2; bool isDistributedCacheFresh = IsFresh(distributedCacheObject); if (isDistributedCacheFresh) { AddToMemoryCache(key, distributedCacheObject); } else { if (refreshBehaviour == RefreshBehaviour.WaitForFreshData) { return(await RecacheItemInMemoryAndDistCacheAsync(dataGetter, key, cancellationToken, _whenDataIsStaleDelegate)); } else if (refreshBehaviour == RefreshBehaviour.DontWaitForFreshData) { #pragma warning disable 4014 Task.Factory.StartNew(async() => await RecacheItemInMemoryAndDistCacheAsync(dataGetter, key, cancellationToken, _whenDataIsStaleDelegate), cancellationToken); #pragma warning restore 4014 } } return(distributedCacheObject.Content); } } // data isn't in either memory or distributed cache if (notInCacheBehaviour == NotInCacheBehaviour.WaitForData) { return(await RecacheItemInMemoryAndDistCacheAsync(dataGetter, key, cancellationToken, _whenDataIsStaleDelegate)); } else if (notInCacheBehaviour == NotInCacheBehaviour.DontWaitForData) { #pragma warning disable 4014 Task.Factory.StartNew(async() => await RecacheItemInMemoryAndDistCacheAsync(dataGetter, key, cancellationToken, _whenDataIsStaleDelegate), cancellationToken); #pragma warning restore 4014 } return(default);