private async Task <DownloadNewImagesResult> DownloadNewImages(String id) { logger.Info("downloadNewImages"); var wallpaperResponse = await _irpyteDownloader.Wallpaper(id); if (wallpaperResponse.imageResults.Count == 0) { logger.Info("Search resulted in 0 images"); } var downloadedFilenamesMaybe = await Task.WhenAll(wallpaperResponse.imageResults.Select(entry => { try { var fileId = Guid.NewGuid(); var fileExtension = Path.GetExtension(entry.url); var filePath = Path.Combine(DB.Instance.ImagesPath, fileId.ToString() + fileExtension); var fileStream = new FileStream(filePath, FileMode.CreateNew); var fileName = Path.GetFileName(filePath); logger.Info($"Getting {entry.url} into {filePath}"); var responseStream = _httpClient.GetStreamAsync(entry.url); return(responseStream .ContinueWith(r => r.Result.CopyToAsync(fileStream), TaskContinuationOptions.OnlyOnRanToCompletion).Unwrap() .ContinueWith(r => fileName, TaskContinuationOptions.OnlyOnRanToCompletion) .ContinueWith(t => { logger.Info($"Disposing fileStream {filePath} and responseStream"); fileStream.Dispose(); responseStream.Dispose(); return t; }).Unwrap()); } catch (Exception e) { logger.Error(e, "Error while downloading a file"); return(null); } })); var downloadedFilenames = downloadedFilenamesMaybe.Where(x => x != null); var downloadedImages = downloadedFilenames.ToList(); logger.Info($"Downloaded {downloadedImages.Count}"); var appConfig = DB.Instance.GetConfig(); appConfig.imageFileNames.AddRange(downloadedImages); DB.Instance.UpdateConfig(appConfig); if (downloadedImages.Count == 0) { return(new DownloadNewImagesResult(true)); } else { return(new DownloadNewImagesResult()); } }