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

背水一戰 Windows 10 (120)

/*
 * 演示 uwp 的後臺上傳任務
 * 
 * BackgroundUploader - 後臺上傳工作管理員
 *     CreateUpload(Uri uri, IStorageFile sourceFile) - 建立一個上傳任務,返回 UploadOperation 物件
 *     CreateUploadFromStreamAsync(Uri uri, IInputStream sourceStream) - 以流的方式建立一個上傳任務
 *     CreateUploadAsync(Uri uri, IEnumerable<BackgroundTransferContentPart> parts) - 建立一個包含多個上傳檔案的上傳任務
 *     SetRequestHeader(string headerName, string headerValue) - 設定 http 請求頭
 *     Method - 用於上傳的 http method(預設 post)
 *     static GetCurrentUploadsAsync() - 獲取當前 app 的未與組關聯的所有上傳任務
 *     CostPolicy - 上傳的成本策略,BackgroundTransferCostPolicy 列舉
 *         Default - 不允許在高成本(比如 4G)網路上傳輸
 *         UnrestrictedOnly - 允許在高成本(比如 4G)網路上傳輸
 *         Always - 無論如何均可傳輸,即使在漫遊時
 *     ServerCredential - 與服務端通訊時的憑據
 *     ProxyCredential - 使用代理時的身份憑據
 *     SuccessToastNotification, SuccessTileNotification, FailureToastNotification, FailureTileNotification - 上傳任務成功或失敗後的 toast 或 tile 通知
 *     static GetCurrentUploadsForTransferGroupAsync(BackgroundTransferGroup group) - 獲取指定組的所有上傳任務
 *     TransferGroup - 設定或獲取分組物件(BackgroundTransferGroup 型別)
 *     BackgroundUploader(BackgroundTransferCompletionGroup completionGroup) - 通過指定的 BackgroundTransferCompletionGroup 物件例項化 BackgroundUploader 物件
 *     CompletionGroup - 獲取關聯的 BackgroundTransferCompletionGroup 物件
 *     
 * UploadOperation - 上傳任務物件
 *     Guid - 獲取此上傳任務的標識
 *     CostPolicy - 上傳的成本策略,BackgroundTransferCostPolicy 列舉
 *     RequestedUri - 上傳任務所請求的服務端地址
 *     SourceFile - 需要上傳的檔案,如果是一次上傳多個檔案則此屬性為 null
 *     Method - 獲取用於上傳的 http method(get, post 之類的)
 *     GetResponseInformation() - 上傳完成後獲取到的服務端響應資訊,返回 ResponseInformation 物件
 *         ActualUri - 上傳服務的真實 URI
 *         Headers - 服務端響應的 HTTP 頭
 *         StatusCode - 服務端響應的狀態碼
 *     StartAsync() - 新增一個上傳任務,返回 IAsyncOperationWithProgress<UploadOperation, UploadOperation> 物件
 *     AttachAsync() - 監視已存在的上傳任務,返回 IAsyncOperationWithProgress<UploadOperation, UploadOperation> 物件
 *     Progress - 獲取上傳進度,返回 BackgroundUploadProgress 物件
 *     Priority - 上傳的優先順序,BackgroundTransferPriority 列舉
 *         Default 或 High
 *     TransferGroup - 獲取此上傳任務的分組物件(BackgroundTransferGroup 型別)
 *     
 * BackgroundUploadProgress - 後臺上傳任務的上傳進度物件
 *     BytesSent - 已上傳的位元組數
 *     TotalBytesToSend - 總共需要上傳的位元組數
 *     BytesReceived - 已下載的位元組數
 *     TotalBytesToReceive - 總共需要下載的位元組數,未知則為 0 
 *     Status - 上傳狀態,BackgroundTransferStatus 列舉
 *         Idle, Running, PausedByApplication, PausedCostedNetwork, PausedNoNetwork, Completed, Canceled, Error
 *     HasResponseChanged - 服務端響應了則為 true
 *     HasRestarted - 當上傳連線斷掉後,系統會重新上傳,此種情況則為 true
 *     
 * BackgroundTransferGroup - 後臺上傳任務的分組物件
 *     static BackgroundTransferGroup CreateGroup(string name) - 建立指定分組標識的 BackgroundTransferGroup 物件
 *     Name - 分組標識(只讀)
 *     TransferBehavior - 組內上傳任務的執行方式,BackgroundTransferBehavior 列舉
 *         Parallel - 並行
 *         Serialized - 序列
 * 
 * BackgroundTransferCompletionGroup - 分組物件(用於實現“組任務全部完成後觸發後臺任務”)
 *     Enable() - 啟用“組任務全部完成後觸發後臺任務”的功能
 *     IsEnabled - 是否啟用了“組任務全部完成後觸發後臺任務”的功能(只讀)
 *     Trigger - “組任務全部完成後觸發後臺任務”的觸發器
 *     
 * BackgroundTransferContentPart - 當一次上傳多個檔案時,將每個需要上傳的檔案構造成一個 BackgroundTransferContentPart 物件
 *     BackgroundTransferContentPart(string name, string fileName) - 通過一個標識和檔名稱例項化 BackgroundTransferContentPart 物件
 *     SetFile(IStorageFile value) - 指定需要上傳的檔案
 *     
 * 
 * 注:關於上傳任務的“任務分組,並行或序列執行,組完成後通知”和“任務分組,組完成後觸發後臺任務”的實現方式與下載任務是一樣的,請參見下載任務的相關演示示例(TransferGroup.xaml.cs 和 TransferBackground.xaml.cs)
 
*/ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Threading; using System.Threading.Tasks; using Windows.Data.Xml.Dom; using Windows.Networking.BackgroundTransfer; using Windows.Storage; using Windows.UI.Notifications;
using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.Web; namespace Windows10.BackgroundTask { public sealed partial class TransferUpload : Page { // 上傳任務的集合 private ObservableCollection<TransferModel> _transfers = new ObservableCollection<TransferModel>();
// 所有上傳任務的關聯的 CancellationTokenSource 物件 private CancellationTokenSource _cancelToken = new CancellationTokenSource(); public TransferUpload() { this.InitializeComponent(); Init(); } private async void Init() { listView.ItemsSource = _transfers; // 載入全部上傳任務 await LoadUploadAsync(); } // 載入全部上傳任務 private async Task LoadUploadAsync() { IReadOnlyList<UploadOperation> uploads = null; try { // 獲取所有後臺上傳任務 uploads = await BackgroundUploader.GetCurrentUploadsAsync(); } catch (Exception ex) { WriteLine(ex.ToString()); return; } if (uploads.Count > 0) { List<Task> tasks = new List<Task>(); foreach (UploadOperation upload in uploads) { // 監視指定的後臺上傳任務 tasks.Add(HandleUploadAsync(upload, false)); } await Task.WhenAll(tasks); } } // 新增一個上傳任務(一次請求上傳一個檔案) private async void btnAddUpload_Click(object sender, RoutedEventArgs e) { // 上傳服務的地址 Uri serverUri = new Uri("http://localhost:44914/api/Upload", UriKind.Absolute); StorageFile sourceFile; try { // 需要上傳的檔案 sourceFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/hololens.jpg", UriKind.Absolute)); } catch (Exception ex) { WriteLine(ex.ToString()); return; } // 例項化 BackgroundUploader,並設定 http header BackgroundUploader backgroundUploader = new BackgroundUploader(); backgroundUploader.SetRequestHeader("Filename", "hololens.jpg"); // 任務成功後彈出指定的 toast 通知(類似的還有 SuccessTileNotification, FailureToastNotification, FailureTileNotification) backgroundUploader.SuccessToastNotification = GetToastNotification(); // 建立一個後臺上傳任務,此任務包含一個上傳檔案 UploadOperation upload = backgroundUploader.CreateUpload(serverUri, sourceFile); // 以流的方式建立一個後臺上傳任務 // await backgroundUploader.CreateUploadFromStreamAsync(Uri uri, IInputStream sourceStream); // 處理並監視指定的後臺上傳任務 await HandleUploadAsync(upload, true); } // 新增一個上傳任務(一次請求上傳多個檔案) private async void btnAddMultiUpload_Click(object sender, RoutedEventArgs e) { // 上傳服務的地址 Uri serverUri = new Uri("http://localhost:44914/api/Upload", UriKind.Absolute); // 需要上傳的檔案源集合 List<StorageFile> sourceFiles = new List<StorageFile>(); for (int i = 0; i < 3; i++) { StorageFile sourceFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/hololens.jpg", UriKind.Absolute)); sourceFiles.Add(sourceFile); } // 構造需要上傳 BackgroundTransferContentPart 集合 List<BackgroundTransferContentPart> contentParts = new List<BackgroundTransferContentPart>(); for (int i = 0; i < sourceFiles.Count; i++) { BackgroundTransferContentPart contentPart = new BackgroundTransferContentPart("File" + i, sourceFiles[i].Name); contentPart.SetFile(sourceFiles[i]); contentParts.Add(contentPart); } BackgroundUploader backgroundUploader = new BackgroundUploader(); // 任務成功後彈出指定的 toast 通知(類似的還有 SuccessTileNotification, FailureToastNotification, FailureTileNotification) backgroundUploader.SuccessToastNotification = GetToastNotification(); // 建立一個後臺上傳任務,此任務包含多個上傳檔案 UploadOperation upload = await backgroundUploader.CreateUploadAsync(serverUri, contentParts); // 處理並監視指定的後臺上傳任務 await HandleUploadAsync(upload, true); } /// <summary> /// 處理並監視指定的後臺上傳任務 /// </summary> /// <param name="upload">後臺上傳任務</param> /// <param name="isNew">是否是新增的任務</param> private async Task HandleUploadAsync(UploadOperation upload, bool isNew) { try { // 將 UploadOperation 附加到 TransferModel,以便上傳進度可通知 TransferModel transfer = new TransferModel(); transfer.UploadOperation = upload; transfer.Source = "多個檔案"; transfer.Destination = upload.RequestedUri.ToString(); transfer.Progress = upload.Progress.Status.ToString() + "0 / 0"; _transfers.Add(transfer); WriteLine("Task Count: " + _transfers.Count.ToString()); // 當上傳進度發生變化時的回撥函式 Progress<UploadOperation> progressCallback = new Progress<UploadOperation>(UploadProgress); if (isNew) await upload.StartAsync().AsTask(_cancelToken.Token, progressCallback); // 啟動一個後臺上傳任務 else await upload.AttachAsync().AsTask(_cancelToken.Token, progressCallback); // 監視已存在的後臺上傳任務 // 上傳完成後獲取服務端的響應資訊 ResponseInformation response = upload.GetResponseInformation(); WriteLine("Completed: " + response.ActualUri + ", HttpStatusCode: " + response.StatusCode.ToString()); } catch (TaskCanceledException) // 呼叫 CancellationTokenSource.Cancel() 後會丟擲此異常 { WriteLine("Canceled: " + upload.Guid); } catch (Exception ex) { // 將異常轉換為 WebErrorStatus 列舉,如果獲取到的是 WebErrorStatus.Unknown 則說明此次異常不是涉及 web 的異常 WebErrorStatus error = BackgroundTransferError.GetStatus(ex.HResult); WriteLine(ex.ToString()); } finally { _transfers.Remove(_transfers.First(p => p.UploadOperation == upload)); } } // 進度發生變化時,更新 TransferModel 的 Progress private void UploadProgress(UploadOperation upload) { TransferModel transfer = _transfers.First(p => p.UploadOperation == upload); transfer.Progress = upload.Progress.Status.ToString() + ": " + upload.Progress.BytesSent.ToString("#,0") + " / " + upload.Progress.TotalBytesToSend.ToString("#,0"); } // 取消全部後臺上傳任務 private void btnCancel_Click(object sender, RoutedEventArgs e) { _cancelToken.Cancel(); _cancelToken.Dispose(); _cancelToken = new CancellationTokenSource(); } // 向 lblMsg 中追加一行文字 private void WriteLine(string message) { lblMsg.Text += message; lblMsg.Text += Environment.NewLine; scrollViewer.ChangeView(0, scrollViewer.ScrollableHeight, 1f); } // 構造指定的 toast 通知 private ToastNotification GetToastNotification() { string toastXml = $@" <toast activationType='foreground'> <visual> <binding template='ToastGeneric'> <text>toast - title</text> <text>上傳任務成功完成</text> </binding> </visual> </toast>"; XmlDocument toastDoc = new XmlDocument(); toastDoc.LoadXml(toastXml); return new ToastNotification(toastDoc); } } }

相關推薦

背水一戰 Windows 10 (120) - 後臺任務: 後臺上傳任務

prope message avi title visual AD tex jpg parent [源碼下載] 背水一戰 Windows 10 (120) - 後臺任務: 後臺上傳任務 作者:webabcd介紹背水一戰 Windows 10 之 後臺任務 後臺上傳

背水一戰 Windows 10 (120)

/* * 演示 uwp 的後臺上傳任務 * * BackgroundUploader - 後臺上傳工作管理員 * CreateUpload(Uri uri, IStorageFile sourceFile) - 建立一個上傳任務,返回 UploadOperation 物件 *

背水一戰 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 中的元素[源