private async Task <Uri> HandleDownload(DownloadOperation download, bool alreadyStarted) { var bindableDownload = new BindableDownloadOperation(download); try { ActiveDownloads.Add(bindableDownload); var callback = new Progress <DownloadOperation>(OnDownloadStatusUpdate); IAsyncOperationWithProgress <DownloadOperation, DownloadOperation> op = null; if (alreadyStarted) { var d = download.AttachAsync(); op = download.AttachAsync(); } else { op = download.StartAsync(); } op.Progress = (a, p) => { OnBindableStatusUpdate(bindableDownload); }; // awaits completion of download DownloadOperation completedDownload = await op.AsTask(Cts.Token, callback); return(FileUtils.UriFor(completedDownload.ResultFile)); } finally { // download complete ActiveDownloads.Remove(bindableDownload); } }
/// <summary> /// Hanbdles a single BackgroundDownload for a song. /// </summary> /// <param name="song"> /// The song to be downloaded /// </param> /// <param name="download"> /// The download operation /// </param> /// <param name="start"> /// Either the download is started or just handled /// </param> private async void HandleDownload(Song song, DownloadOperation download, bool start) { if (song == null || download == null) { return; } song.Download = new BackgroundDownload(download); ActiveDownloads.Add(song); try { var progressCallback = new Progress <DownloadOperation>(DownloadProgress); if (start) { // Start the BackgroundDownload and attach a progress handler. await download.StartAsync().AsTask(song.Download.CancellationTokenSrc.Token, progressCallback); } else { // The BackgroundDownload was already running when the application started, re-attach the progress handler. await download.AttachAsync().AsTask(song.Download.CancellationTokenSrc.Token, progressCallback); } // Download Completed var response = download.GetResponseInformation(); // Make sure it is success if (response.StatusCode < 400) { await DownloadFinishedForAsync(song); } else { song.SongState = SongState.None; sqlService.UpdateItem(song); download.ResultFile.DeleteAsync(); } } catch { song.SongState = SongState.None; sqlService.UpdateItem(song); download.ResultFile.DeleteAsync(); } finally { ActiveDownloads.Remove(song); } }
public Texture2D GetTexture(string url) { if (string.IsNullOrEmpty(url)) { return(null); } if (Images.ContainsKey(url)) { return(Images[url]); } if (ImageDownloads.ContainsKey(url)) { // waiting for download return(null); } var download = new ImageDownload(this, url); ImageDownloads.Add(url, download); ActiveDownloads.Add(download); return(null); }