1. 程式人生 > >背水一戰 Windows 10 (119)

背水一戰 Windows 10 (119)

/*
 * 演示後臺下載任務的分組,以及組任務全部完成後如何觸發後臺任務
 * 
 * BackgroundTransferCompletionGroup - 分組物件(用於實現“組任務全部完成後觸發後臺任務”)
 *     Enable() - 啟用“組任務全部完成後觸發後臺任務”的功能
 *     IsEnabled - 是否啟用了“組任務全部完成後觸發後臺任務”的功能(只讀)
 *     Trigger - “組任務全部完成後觸發後臺任務”的觸發器
 *     
 * BackgroundDownloader - 後臺下載工作管理員
 *     BackgroundDownloader(BackgroundTransferCompletionGroup completionGroup) - 通過指定的 BackgroundTransferCompletionGroup 物件例項化 BackgroundDownloader 物件
 *     CompletionGroup - 獲取關聯的 BackgroundTransferCompletionGroup 物件
 *     
 *     
 * 注:需要引用後臺任務專案,相關程式碼參見 BackgroundTaskLib/BackgroundTaskTransfer.cs
 
*/ using BackgroundTaskLib; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Threading; using System.Threading.Tasks; using Windows.ApplicationModel.Background; using Windows.Networking.BackgroundTransfer; using Windows.Storage;
using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; using Windows.Web; namespace Windows10.BackgroundTask { public sealed partial class TransferBackground : Page { // 後臺任務是否已在系統中註冊 private bool _taskRegistered = false
; // 下載任務的集合 private ObservableCollection<TransferModel> _transfers = new ObservableCollection<TransferModel>(); // 所有下載任務的關聯的 CancellationTokenSource 物件 private CancellationTokenSource _cancelToken = new CancellationTokenSource(); public TransferBackground() { this.InitializeComponent(); Init(); } private async void Init() { listView.ItemsSource = _transfers; // 載入存在的下載任務 await LoadDownloadAsync(); } // 載入存在的下載任務 private async Task LoadDownloadAsync() { IReadOnlyList<DownloadOperation> downloads = null; try { // 獲取存在的下載任務 downloads = await BackgroundDownloader.GetCurrentDownloadsAsync(); } catch (Exception ex) { WriteLine(ex.ToString()); return; } if (downloads.Count > 0) { List<Task> tasks = new List<Task>(); foreach (DownloadOperation download in downloads) { // 監視指定的後臺下載任務 tasks.Add(HandleDownloadAsync(download, false)); } await Task.WhenAll(tasks); } } protected override void OnNavigatedTo(NavigationEventArgs e) { // 遍歷所有已註冊的後臺任務 foreach (KeyValuePair<Guid, IBackgroundTaskRegistration> task in BackgroundTaskRegistration.AllTasks) { if (task.Value.Name == BackgroundTaskTransfer.TaskName) { _taskRegistered = true; break; } } UpdateUI(); } // 新增一組(3 個)下載任務,並註冊指定的後臺任務 private async void btnAddDownloadAndRegister_Click(object sender, RoutedEventArgs e) { // 註冊指定的後臺任務,並返回與此後臺任務相關聯的 BackgroundDownloader 物件 BackgroundDownloader downloader = BackgroundTaskTransfer.RegisterBackgroundTaskAndReturnBackgrounDownloader(); _taskRegistered = true; UpdateUI(); List<DownloadOperation> downloads = new List<DownloadOperation>(); for (int i = 0; i < 3; i++) { Uri uri = new Uri("http://files.cnblogs.com/webabcd/Windows10.rar"); StorageFile destinationFile; try { // 儲存的目標地址(別忘了在 Package.appxmanifest 中配置好 <Capability Name="documentsLibrary" /> 和 .rar 型別檔案的關聯) StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.DocumentsLibrary); destinationFile = await storageFolder.CreateFileAsync("Windows10.rar", CreationCollisionOption.GenerateUniqueName); } catch (Exception ex) { WriteLine(ex.ToString()); return; } // 建立一個後臺下載任務 DownloadOperation download = downloader.CreateDownload(uri, destinationFile); downloads.Add(download); } // 啟用“組任務全部完成後觸發後臺任務”的功能 downloader.CompletionGroup.Enable(); WriteLine("用於完成後觸發後臺任務的一組下載任務建立完成了,相關的後臺任務也註冊了"); // 處理並監視組內的後臺下載任務 Task[] tasks = new Task[downloads.Count]; for (int i = 0; i < downloads.Count; i++) { tasks[i] = HandleDownloadAsync(downloads[i], true); } await Task.WhenAll(tasks); } /// <summary> /// 處理並監視組內的後臺下載任務 /// </summary> /// <param name="download">後臺下載任務</param> /// <param name="isNew">是否是新增的任務</param> private async Task HandleDownloadAsync(DownloadOperation download, bool isNew) { try { // 構造顯示用的相關資料 TransferModel transfer = new TransferModel(); transfer.DownloadOperation = download; transfer.Source = download.RequestedUri.ToString(); transfer.Destination = download.ResultFile.Path; transfer.Progress = download.Progress.Status.ToString() + ": 0 / 0"; _transfers.Add(transfer); WriteLine("Task Count: " + _transfers.Count.ToString()); // 當下載進度發生變化時的回撥函式 Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress); if (isNew) await download.StartAsync().AsTask(_cancelToken.Token, progressCallback); // 啟動一個後臺下載任務 else await download.AttachAsync().AsTask(_cancelToken.Token, progressCallback); // 監視已存在的後臺下載任務 // 下載完成後獲取服務端的響應資訊 ResponseInformation response = download.GetResponseInformation(); WriteLine("Completed: " + response.ActualUri + ", HttpStatusCode: " + response.StatusCode.ToString()); } catch (TaskCanceledException) // 呼叫 CancellationTokenSource.Cancel() 後會丟擲此異常 { WriteLine("Canceled: " + download.Guid); } catch (Exception ex) { // 將異常轉換為 WebErrorStatus 列舉,如果獲取到的是 WebErrorStatus.Unknown 則說明此次異常不是涉及 web 的異常 WebErrorStatus error = BackgroundTransferError.GetStatus(ex.HResult); WriteLine(ex.ToString()); } finally { _transfers.Remove(_transfers.First(p => p.DownloadOperation == download)); } } // 進度發生變化時,更新 TransferModel 的 Progress private void DownloadProgress(DownloadOperation download) { TransferModel transfer = _transfers.First(p => p.DownloadOperation == download); transfer.Progress = download.Progress.Status.ToString() + ": " + download.Progress.BytesReceived.ToString("#,0") + " / " + download.Progress.TotalBytesToReceive.ToString("#,0"); } // 向 lblMsg 中追加一行文字 private void WriteLine(string message) { var ignore = lblMsg.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { lblMsg.Text += message; lblMsg.Text += Environment.NewLine; scrollViewer.ChangeView(0, scrollViewer.ScrollableHeight, 1f); }); } // 取消下載任務並登出指定的後臺任務 private void btnRemoveDownloadAndUnregister_Click(object sender, RoutedEventArgs e) { // 取消下載任務 _cancelToken.Cancel(); _cancelToken.Dispose(); _cancelToken = new CancellationTokenSource(); // 登出指定的後臺任務 foreach (KeyValuePair<Guid, IBackgroundTaskRegistration> task in BackgroundTaskRegistration.AllTasks) { if (task.Value.Name == BackgroundTaskTransfer.TaskName) { // 從系統中登出指定的後臺任務。唯一一個引數代表如果當前後臺任務正在執行中,是否需要將其取消 task.Value.Unregister(true); break; } } _taskRegistered = false; UpdateUI(); } private async void UpdateUI() { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { btnAddDownloadAndRegister.IsEnabled = !_taskRegistered; btnRemoveDownloadAndUnregister.IsEnabled = _taskRegistered; }); } } }

相關推薦

背水一戰 Windows 10 (119) - 後臺任務: 後臺下載任務(任務分組,組完成後觸發後臺任務)

mode present llb ner tina when http 對象 pat [源碼下載] 背水一戰 Windows 10 (119) - 後臺任務: 後臺下載任務(任務分組,組完成後觸發後臺任務) 作者:webabcd介紹背水一戰 Windows 10 之 後

背水一戰 Windows 10 (119)

/* * 演示後臺下載任務的分組,以及組任務全部完成後如何觸發後臺任務 * * BackgroundTransferCompletionGroup - 分組物件(用於實現“組任務全部完成後觸發後臺任務”) * Enable() - 啟用“組任務全部完成後觸發後臺任務”的功能

背水一戰 Windows 10 (54) - 控件(集合類): ItemsControl 的布局控件 - OrientedVirtualizingPanel, VirtualizingStackPanel, WrapGrid

schema 事件 panel http bili .text meven bind employee [源碼下載] 背水一戰 Windows 10 (54) - 控件(集合類): ItemsControl 的布局控件 - OrientedVirtualizingPane

背水一戰 Windows 10 (55) - 控件(集合類): ItemsControl - SemanticZoom, ISemanticZoomInformation

ack tty 傳遞 用戶 gef isp als pro msg [源碼下載] 背水一戰 Windows 10 (55) - 控件(集合類): ItemsControl - SemanticZoom, ISemanticZoomInformation 作者:webab

背水一戰 Windows 10 (58) - 控件(集合類): ListViewBase - ListView, GridView

aml dpa net sealed em1 .net http per tran [源碼下載] 背水一戰 Windows 10 (58) - 控件(集合類): ListViewBase - ListView, GridView 作者:webabcd介紹背水一戰 Win

背水一戰 Windows 10 (64) - 控件(WebView): 加載指定 HttpMethod 的請求, 自定義請求的 http header, app 與 js 的交互

如何 pan runt logs threading dto void msg def [源碼下載] 背水一戰 Windows 10 (64) - 控件(WebView): 加載指定 HttpMethod 的請求, 自定義請求的 http header, app 與 js

背水一戰 Windows 10 (37) - 控件(彈出類): MessageDialog, ContentDialog

異步操作 partial his list 文本 err desire secondary sta 原文:背水一戰 Windows 10 (37) - 控件(彈出類): MessageDialog, ContentDialog[源碼下載] 背水一戰 Windows 10

背水一戰 Windows 10 (34) - 控件(進度類): RangeBase, Slider, ProgressBar, ProgressRing

文本 div button 基類 lang block enable led template 原文:背水一戰 Windows 10 (34) - 控件(進度類): RangeBase, Slider, ProgressBar, ProgressRing[源碼下載] 背水

背水一戰 Windows 10 (24) - MVVM: 通過 Binding 或 x:Bind 結合 Command 實現,通過非 ButtonBase 觸發命令

block files grid collect gin 綁定 專註 ins ext 原文:背水一戰 Windows 10 (24) - MVVM: 通過 Binding 或 x:Bind 結合 Command 實現,通過非 ButtonBase 觸發命令[源碼下載] 背

背水一戰 Windows 10 (33) - 控件(選擇類): ListBox, RadioButton, CheckBox, ToggleSwitch

windows view join lms .get orm orien control flipview 原文:背水一戰 Windows 10 (33) - 控件(選擇類): ListBox, RadioButton, CheckBox, ToggleSwitch[源碼下

背水一戰 Windows 10 (27) - 控件(文本類): TextBlock

放大 part psi abcdefg -c 控件 ring pri stat 原文:背水一戰 Windows 10 (27) - 控件(文本類): TextBlock[源碼下載] 背水一戰 Windows 10 (27) - 控件(文本類): TextBlock 作者

背水一戰 Windows 10 (29) - 控件(文本類): RichTextBlock, RichTextBlockOverflow, RichEditBox

names 一個 示例 還原 rabl 工業 指定 鍵盤 mas 原文:背水一戰 Windows 10 (29) - 控件(文本類): RichTextBlock, RichTextBlockOverflow, RichEditBox[源碼下載] 背水一戰 Windows

背水一戰 Windows 10 (59) - 控件(媒體類): Image, MediaElement

ive http .so erb names targe pix target openxml 原文:背水一戰 Windows 10 (59) - 控件(媒體類): Image, MediaElement[源碼下載] 背水一戰 Windows 10 (59) - 控件(媒

背水一戰 Windows 10 (57) - 控件(集合類): ListViewBase - 增量加載, 分步繪制

fun 設置 enter priority protected 最大 卡頓 tinc abc 原文:背水一戰 Windows 10 (57) - 控件(集合類): ListViewBase - 增量加載, 分步繪制[源碼下載] 背水一戰 Windows 10 (57) -

背水一戰 Windows 10 (50) - 控件(集合類): ItemsControl - 基礎知識, 數據綁定, ItemsPresenter, GridViewItemPresenter, ListViewItemPresenter

需要 emc rectangle ems sources mic navi schema mark 原文:背水一戰 Windows 10 (50) - 控件(集合類): ItemsControl - 基礎知識, 數據綁定, ItemsPresenter, GridViewI

背水一戰 Windows 10 (56) - 控件(集合類): ListViewBase - 基礎知識, 拖動項

tar accepted 類型 idv .get footer ati model 變化 原文:背水一戰 Windows 10 (56) - 控件(集合類): ListViewBase - 基礎知識, 拖動項[源碼下載] 背水一戰 Windows 10 (56) - 控件

背水一戰 Windows 10 (67) - 控件(控件基類): DependencyObject - CoreDispatcher, 依賴屬性的設置與獲取, 依賴屬性的變化回調

protected getprop prop 依賴屬性 其他 優先級 dto type 核心 [源碼下載] 背水一戰 Windows 10 (67) - 控件(控件基類): DependencyObject - CoreDispatcher, 依賴屬性的設置與獲取, 依賴

背水一戰 Windows 10 (68) - 控件(控件基類): UIElement - Pointer 相關事件, Tap 相關事件, Key 相關事件, Focus 相關事件

tar release 關於 場景 npr 相對 capture soft etc [源碼下載] 背水一戰 Windows 10 (68) - 控件(控件基類): UIElement - Pointer 相關事件, Tap 相關事件, Key 相關事件, Focus 相關

背水一戰 Windows 10 (69) - 控件(控件基類): UIElement - Manipulate 手勢處理, 路由事件的註冊, 路由事件的冒泡, 命中測試的可見性

alex remove void express 簡單 let win 位置 edr [源碼下載] 背水一戰 Windows 10 (69) - 控件(控件基類): UIElement - Manipulate 手勢處理, 路由事件的註冊, 路由事件的冒泡, 命中測試的可

背水一戰 Windows 10 (76) - 控件(控件基類): Control - 基礎知識, 焦點相關, 運行時獲取 ControlTemplate 和 DataTemplate 中的元素

normal 焦點 colors 指針 是否 樣式 Go 系統 rgs 原文:背水一戰 Windows 10 (76) - 控件(控件基類): Control - 基礎知識, 焦點相關, 運行時獲取 ControlTemplate 和 DataTemplate 中的元素[源