private async Task <BackgroundDownloader> ResetDownloader() { await BackgroundExecutionManager.RequestAccessAsync(); const string BackgroundTransferCompletetionTaskNameBase = "HohoemaBGDLCompletion"; var _BTCG = new BackgroundTransferCompletionGroup(); var groupName = BackgroundTransferCompletetionTaskNameBase + Path.GetFileNameWithoutExtension(Path.GetRandomFileName()); BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.Name = groupName; builder.SetTrigger(_BTCG.Trigger); var status = BackgroundExecutionManager.GetAccessStatus(); BackgroundTaskRegistration downloadProcessingTask = builder.Register(); var _BackgroundDownloader = new BackgroundDownloader(_BTCG) { TransferGroup = BackgroundTransferGroup.CreateGroup(groupName) }; _BackgroundTransferCompletionInfoMap.Add(groupName, new BackgroundTransferCompletionInfo() { Id = groupName, Downloader = _BackgroundDownloader, TaskRegistration = downloadProcessingTask, TransferCompletionGroup = _BTCG }); return(_BackgroundDownloader); }
private BackgroundDownloader CreateBackgroundDownloader() { // Use a unique group name so that no other component in the app uses the same group. The recommended way // is to generate a GUID and use it as group name as shown below. var notificationsGroup = BackgroundTransferGroup.CreateGroup("{E37CDDEC-CFB4-4748-8314-576F1D328A60}"); // When creating a group, we can optionally define the transfer behavior of transfers associated with the // group. A "parallel" transfer behavior allows multiple transfers in the same group to run concurrently // (default). A "serialized" transfer behavior allows at most one default priority transfer at a time for // the group. notificationsGroup.TransferBehavior = BackgroundTransferBehavior.Parallel; BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundTaskBuilder builder = new BackgroundTaskBuilder { TaskEntryPoint = "Aurora.Music.Services.DownloadCompletor" }; builder.SetTrigger(completionGroup.Trigger); BackgroundTaskRegistration taskRegistration = builder.Register(); return(new BackgroundDownloader(completionGroup) { TransferGroup = notificationsGroup }); }
public static BackgroundDownloader CreateBackgroundDownloader() { BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.TaskEntryPoint = "Tasks.CompletionGroupTask"; builder.SetTrigger(completionGroup.Trigger); BackgroundTaskRegistration taskRegistration = builder.Register(); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); return downloader; }
/// <summary> /// 生成绑定了后台任务的后台下载器 /// </summary> internal static BackgroundDownloader CreateBackgroundDownloader(out Guid taskId) { var completionGroup = new BackgroundTransferCompletionGroup(); var builder = new BackgroundTaskBuilder(); builder.TaskEntryPoint = typeof(DownloadTask).FullName; builder.SetTrigger(completionGroup.Trigger); var taskReg = builder.Register(); taskId = taskReg.TaskId; return(new BackgroundDownloader(completionGroup)); }
public static BackgroundDownloader CreateBackgroundDownloader() { BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.TaskEntryPoint = "Tasks.CompletionGroupTask"; builder.SetTrigger(completionGroup.Trigger); BackgroundTaskRegistration taskRegistration = builder.Register(); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); return(downloader); }
private static async Task StartDownload(Uri target, BackgroundTransferPriority priority, string localFilename) { var result = await BackgroundExecutionManager.RequestAccessAsync(); StorageFile destinationFile; destinationFile = await GetLocalFileFromName(localFilename); var group = BackgroundTransferGroup.CreateGroup(Guid.NewGuid().ToString()); group.TransferBehavior = BackgroundTransferBehavior.Serialized; BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); // this will cause the app to be activated when the download completes and // CheckCompletionResult will be called for the final download state RegisterBackgroundTask(completionGroup.Trigger); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); downloader.TransferGroup = group; group.TransferBehavior = BackgroundTransferBehavior.Serialized; CreateNotifications(downloader); DownloadOperation download = downloader.CreateDownload(target, destinationFile); download.Priority = priority; completionGroup.Enable(); Progress <DownloadOperation> progressCallback = new Progress <DownloadOperation>(DownloadProgress); var downloadTask = download.StartAsync().AsTask(progressCallback); string tag = GetFileNameFromUri(target); CreateToast(tag, localFilename); try { await downloadTask; // Will occur after download completes ResponseInformation response = download.GetResponseInformation(); } catch (Exception) { Debug.WriteLine("Download exception"); } }
// 注册指定的后台任务,并返回与此后台任务相关联的 BackgroundDownloader 对象 // 后台任务的注册一般是在前台代码中写的,但是由于本例还有一个后台任务执行完成后重新下载失败任务的功能,所以这部分代码写在后台代码中就很合理了 public static BackgroundDownloader RegisterBackgroundTaskAndReturnBackgrounDownloader() { // 根据指定 BackgroundTransferCompletionGroup 对象创建一个 BackgroundDownloader 对象 BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); // 注册一个后台任务,并指定触发器为 BackgroundTransferCompletionGroup.Trigger BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.Name = BackgroundTaskTransfer.TaskName; builder.TaskEntryPoint = BackgroundTaskTransfer.TaskEntryPoint; builder.SetTrigger(completionGroup.Trigger); BackgroundTaskRegistration task = builder.Register(); return(downloader); }
public static BackgroundDownloader CreateBackgroundDownloader() { BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.TaskEntryPoint = "Tasks.CompletionGroupTask"; builder.SetTrigger(completionGroup.Trigger); // The system automatically unregisters the BackgroundTransferCompletionGroup task when it triggers. // You do not need to unregister it explicitly. BackgroundTaskRegistration taskRegistration = builder.Register(); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); return(downloader); }
public static async Task StartGalleryDownloadAsync(ExGallery gallery, StorageFolder galleryFolder) { // Download image list await gallery.LoadAllItemsAsync(); BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundTaskBuilder builder = new BackgroundTaskBuilder() { Name = "DownloadFinished" }; builder.SetTrigger(completionGroup.Trigger); BackgroundTaskRegistration taskRegistration = builder.Register(); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup) { TransferGroup = BackgroundTransferGroup.CreateGroup("Gallery") }; downloader.TransferGroup.TransferBehavior = BackgroundTransferBehavior.Parallel; // Create tasks and file for each pic StorageFile[] files = new StorageFile[gallery.Count]; foreach (var image in gallery) { files[gallery.IndexOf(image)] = await galleryFolder.CreateFileAsync($"{gallery.IndexOf(image) + 1}.jpg", CreationCollisionOption.ReplaceExisting); } // Get the image uri and download data for each pic List <Task> getImageUriTasks = new List <Task>(); foreach (var image in gallery) { if (files[gallery.IndexOf(image)] != null) { getImageUriTasks.Add(StartImageDownloadAsync(gallery, image, files[gallery.IndexOf(image)], downloader)); } } await Task.WhenAll(getImageUriTasks); downloader.CompletionGroup.Enable(); }
/// <summary> /// Creates a background download for given OneDriveId /// </summary> /// <param name="oneDriveId">OneDrive item's Id</param> /// <param name="destinationFile">A <see cref="StorageFile"/> to which content will be downloaded</param> /// <param name="completionGroup">The <see cref="BackgroundTransferCompletionGroup"/> to which should <see cref="BackgroundDownloader"/> reffer to</param> /// <param name="cancellationToken">The <see cref="CancellationToken"/> for the request</param> /// <returns>The created <see cref="DownloadOperation"/></returns> public async Task <DownloadOperation> CreateBackgroundDownloadForItemAsync(string oneDriveId, StorageFile destinationFile, BackgroundTransferCompletionGroup completionGroup = null, CancellationToken cancellationToken = default(CancellationToken)) { if (string.IsNullOrWhiteSpace(oneDriveId)) { throw new ArgumentNullException(nameof(oneDriveId)); } if (destinationFile == null) { throw new ArgumentNullException(nameof(destinationFile)); } // log the user silently with a Microsoft Account associate to Windows if (IsConnected == false) { OneDriveService.Instance.Initialize(); if (!await OneDriveService.Instance.LoginAsync()) { throw new Exception("Unable to sign in"); } } return(await Task.Run( async() => { var requestMessage = Provider.Drive.Items[oneDriveId].Content.Request().GetHttpRequestMessage(); await Provider.AuthenticationProvider.AuthenticateRequestAsync(requestMessage).AsAsyncAction().AsTask(cancellationToken); var downloader = completionGroup == null ? new BackgroundDownloader() : new BackgroundDownloader(completionGroup); foreach (var item in requestMessage.Headers) { downloader.SetRequestHeader(item.Key, item.Value.First()); } return downloader.CreateDownload(requestMessage.RequestUri, destinationFile); }, cancellationToken)); }
/// <inheritdoc/> public async Task <DownloadOperation> CreateBackgroundDownloadAsync(StorageFile destinationFile, BackgroundTransferCompletionGroup completionGroup = null, CancellationToken cancellationToken = default(CancellationToken)) { if (destinationFile == null) { throw new ArgumentNullException(nameof(destinationFile)); } return(await Task.Run( async() => { var requestMessage = ((IGraphServiceClient)Provider).Drive.Items[OneDriveItem.Id].Content.Request().GetHttpRequestMessage(); await Provider.AuthenticationProvider.AuthenticateRequestAsync(requestMessage).AsAsyncAction().AsTask(cancellationToken); var downloader = completionGroup == null ? new BackgroundDownloader() : new BackgroundDownloader(completionGroup); foreach (var item in requestMessage.Headers) { downloader.SetRequestHeader(item.Key, item.Value.First()); } return downloader.CreateDownload(requestMessage.RequestUri, destinationFile); }, cancellationToken)); }
private async Task <UploadOperation> CreateBackgroundUploadForItemAsync(OneDriveStorageFolder destinationFolder, StorageFile sourceFile, BackgroundTransferCompletionGroup completionGroup = null, CancellationToken cancellationToken = default(CancellationToken)) { if (destinationFolder == null) { throw new ArgumentNullException(nameof(destinationFolder)); } if (sourceFile == null) { throw new ArgumentNullException(nameof(sourceFile)); } //var fileCreateNew = await destinationFolder.CreateFileAsync(desiredName, CreationCollisionOption.OpenIfExists); return(await Task.Run( async() => { var requestMessage = OneDriveService.Instance.Provider.GraphProvider.Drive.Items[destinationFolder.OneDriveItem.Id].Content.Request().GetHttpRequestMessage(); await OneDriveService.Instance.Provider.GraphProvider.AuthenticationProvider.AuthenticateRequestAsync(requestMessage).AsAsyncAction().AsTask(cancellationToken); var uploader = completionGroup == null ? new BackgroundUploader() : new BackgroundUploader(completionGroup); foreach (var item in requestMessage.Headers) { uploader.SetRequestHeader(item.Key, item.Value.First()); } uploader.SetRequestHeader("Filename", sourceFile.Name); return uploader.CreateUpload(requestMessage.RequestUri, sourceFile); }, cancellationToken)); }
/// <summary> /// Creates a background download for given OneDriveId /// </summary> /// <param name="oneDriveId">OneDrive item's Id</param> /// <param name="destinationFile">A <see cref="StorageFile"/> to which content will be downloaded</param> /// <param name="completionGroup">The <see cref="BackgroundTransferCompletionGroup"/> to which should <see cref="BackgroundDownloader"/> reffer to</param> /// <param name="cancellationToken">The <see cref="CancellationToken"/> for the request</param> /// <returns>The created <see cref="DownloadOperation"/></returns> private async Task <DownloadOperation> CreateBackgroundDownloadForItemInternalAsync(string oneDriveId, StorageFile destinationFile, BackgroundTransferCompletionGroup completionGroup = null, CancellationToken cancellationToken = default(CancellationToken)) { if (string.IsNullOrWhiteSpace(oneDriveId)) { throw new ArgumentNullException(nameof(oneDriveId)); } if (destinationFile == null) { throw new ArgumentNullException(nameof(destinationFile)); } return(await Task.Run( async() => { var requestMessage = _service.Provider.GraphProvider.Drive.Items[oneDriveId].Content.Request().GetHttpRequestMessage(); await _service.Provider.GraphProvider.AuthenticationProvider.AuthenticateRequestAsync(requestMessage).AsAsyncAction().AsTask(cancellationToken); var downloader = completionGroup == null ? new BackgroundDownloader() : new BackgroundDownloader(completionGroup); foreach (var item in requestMessage.Headers) { downloader.SetRequestHeader(item.Key, item.Value.First()); } return downloader.CreateDownload(requestMessage.RequestUri, destinationFile); }, cancellationToken)); }
private async void AppBarButton_Click(object sender, RoutedEventArgs e) { if (this.GalleryViewModel?.Gallery == null) { return; } var savePicker = new FolderPicker(); //savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; savePicker.FileTypeFilter.Add("*"); var galleryParentFolder = await savePicker.PickSingleFolderAsync(); if (galleryParentFolder == null) { return; } var galleryFolder = await galleryParentFolder.CreateFolderAsync(this.GalleryViewModel.Gallery.Gid, CreationCollisionOption.OpenIfExists); //var galleriesFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(EX_GALLERIES_FOLDER_NAME, CreationCollisionOption.OpenIfExists); //var galleryFolder = await galleriesFolder.CreateFolderAsync(this.GalleryViewModel.Gallery.Gid, CreationCollisionOption.OpenIfExists); // Download image list await this.GalleryViewModel.Gallery.LoadAllItemsAsync(); BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.Name = "DownloadFinished"; builder.SetTrigger(completionGroup.Trigger); BackgroundTaskRegistration taskRegistration = builder.Register(); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); downloader.TransferGroup = BackgroundTransferGroup.CreateGroup($"{this.GalleryViewModel.Gallery.Gid}"); downloader.TransferGroup.TransferBehavior = BackgroundTransferBehavior.Parallel; // Create tasks and file for each pic StorageFile[] files = new StorageFile[this.GalleryViewModel.Gallery.Count]; foreach (var image in this.GalleryViewModel.Gallery) { files[this.GalleryViewModel.Gallery.IndexOf(image)] = await galleryFolder.CreateFileAsync($"{this.GalleryViewModel.Gallery.IndexOf(image) + 1}.jpg", CreationCollisionOption.ReplaceExisting); } // Get the image uri and download data for each pic List <Task> getImageUriTasks = new List <Task>(); var gallery = this.GalleryViewModel.Gallery; foreach (var image in gallery) { getImageUriTasks.Add(Download(image, files[gallery.IndexOf(image)], downloader)); } await Task.WhenAll(getImageUriTasks); downloader.CompletionGroup.Enable(); await new MessageDialog("You can exit the app now. There will be a toast notification when all downloads are finished.", "Download started").ShowAsync(); }
public BackgroundDownloadHelper() { completionGroup = new BackgroundTransferCompletionGroup(); downloader = new BackgroundDownloader(completionGroup); }