private async Task <T> GetFromCacheOrDownloadAsync(Uri uri, string fileName, bool preCacheOnly) { StorageFile baseFile = null; T instance = default(T); DateTime expirationDate = DateTime.Now.Subtract(CacheDuration); if (_inMemoryFileStorage.MaxItemCount > 0) { var msi = _inMemoryFileStorage.GetItem(fileName, CacheDuration); if (msi != null) { instance = msi.Item; } } if (instance != null) { return(instance); } var folder = await GetCacheFolderAsync(); baseFile = await folder.TryGetItemAsync(fileName) as StorageFile; if (await IsFileOutOfDate(baseFile, expirationDate)) { baseFile = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); try { instance = await DownloadFileAsync(uri, baseFile, preCacheOnly); } catch (Exception) { await baseFile.DeleteAsync().AsTask().ConfigureAwait(false); throw; // rethrowing the exception changes the stack trace. just throw } } if (EqualityComparer <T> .Default.Equals(instance, default(T)) && !preCacheOnly) { using (var fileStream = await baseFile.OpenAsync(FileAccessMode.Read)) { instance = await InitializeTypeAsync(fileStream); } if (_inMemoryFileStorage.MaxItemCount > 0) { var properties = await baseFile.GetBasicPropertiesAsync().AsTask().ConfigureAwait(false); var msi = new InMemoryStorageItem <T>(fileName, properties.DateModified.DateTime, instance); _inMemoryFileStorage.SetItem(msi); } } return(instance); }
private async Task <T> GetFromCacheOrDownloadAsync(Uri uri, string fileName, bool preCacheOnly, CancellationToken cancellationToken, List <KeyValuePair <string, object> > initializerKeyValues) { StorageFile baseFile = null; T instance = default(T); if (_inMemoryFileStorage.MaxItemCount > 0) { var msi = _inMemoryFileStorage.GetItem(fileName, CacheDuration); if (msi != null) { instance = msi.Item; } } if (instance != null) { return(instance); } var folder = await GetCacheFolderAsync().ConfigureAwait(MaintainContext); baseFile = await folder.TryGetItemAsync(fileName).AsTask().ConfigureAwait(MaintainContext) as StorageFile; if (baseFile == null || await IsFileOutOfDateAsync(baseFile, CacheDuration).ConfigureAwait(MaintainContext)) { baseFile = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting).AsTask().ConfigureAwait(MaintainContext); try { instance = await DownloadFileAsync(uri, baseFile, preCacheOnly, cancellationToken, initializerKeyValues).ConfigureAwait(false); } catch (Exception) { await baseFile.DeleteAsync().AsTask().ConfigureAwait(false); throw; // re-throwing the exception changes the stack trace. just throw } } if (EqualityComparer <T> .Default.Equals(instance, default(T)) && !preCacheOnly) { instance = await InitializeTypeAsync(baseFile, initializerKeyValues).ConfigureAwait(false); if (_inMemoryFileStorage.MaxItemCount > 0) { var properties = await baseFile.GetBasicPropertiesAsync().AsTask().ConfigureAwait(false); var msi = new InMemoryStorageItem <T>(fileName, properties.DateModified.DateTime, instance); _inMemoryFileStorage.SetItem(msi); } } return(instance); }