小小一方士 C# AsyncAwait 之 上传/下载文件进度条实现原理

Posted lpudding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小小一方士 C# AsyncAwait 之 上传/下载文件进度条实现原理相关的知识,希望对你有一定的参考价值。

关于上传下载文件(图片等),涉及到UI进度条的显示,c#中 System.IProgress提供了相应的api.

namespace System

    //
    // 摘要:
    //     定义进度更新的提供程序。
    //
    // 类型参数:
    //   T:
    //     进度更新值的类型。此类型参数是逆变。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的详细信息,请参阅 泛型中的协变和逆变。
    public interface IProgress<in T>
    
        //
        // 摘要:
        //     报告进度更新。
        //
        // 参数:
        //   value:
        //     进度更新之后的值。
        void Report(T value);
    

对于多个文件的使用,这个使用还是很不错的选择,如下为相关使用代码:

 1   async Task<int> UploadPicturesAsync(List<object> imageList, IProgress<int> progress, CancellationToken ct)
 2         
 3             try
 4             
 5                 int totalCount = imageList.Count;
 6                 int processCount = await Task.Run<int>(() =>
 7                 
 8                     int tempCount = 0;
 9                     foreach (var image in imageList)
10                     
11                         //await the processing and uploading logic here
12                         //int processed = await UploadAndProcessAsync(image);
13                         // 异步上传/下载方法
14                         bool success = Task.Run(async () =>
15                                   
16                                       await Task.Delay(2000);
17                                       return image.ToString() == "取消" ? false : true;
18                                   ).Result;
19                         if (ct.IsCancellationRequested)     //判断是否取消
20                         
21                             ct.ThrowIfCancellationRequested();
22                           
23                         if (progress != null)
24                         
25                             progress.Report((tempCount * 100 / totalCount));
26                         
27                         tempCount++;
28                     
29 
30                     return tempCount;
31                 );
32                 return processCount;
33             
34             catch (OperationCanceledException ex)
35                 
36                 throw ex;
37             
38         
39         // 向应该被取消的 System.Threading.CancellationToken 发送信号
40         // cts.Token 传播有关应取消操作的通知。
41         CancellationTokenSource cts = new CancellationTokenSource();
42         /// <summary>
43         /// 进度条 异步上传   异步上传button
44         /// </summary>
45         public async void ProgressBar()
46         
47             //construct Progress<T>, passing ReportProgress as the Action<T> 
48             //Progress 提供调用每个报告进度的值的回调的 
49             var progressIndicator = new Progress<int>(ReportProgress);
50             //call async method
51             // 模拟上传/下载文件
52             List<object> files = new List<object>
53             
54                 1,2,"取消",3,4,5,2,4,11
55             ;
56             try
57             
58                 int uploads = await UploadPicturesAsync(files, progressIndicator, cts.Token);
59                 Console.WriteLine($"upload Count=>uploads");
60             
61             catch (OperationCanceledException ex)
62             
63                 Console.WriteLine($"上传已取消:ex.Message");
64             
65         
66         /// <summary>
67         /// UI线程交互
68         /// </summary>
69         /// <param name="value"></param>
70         void ReportProgress(int value)
71         
72             //UI 线程显示进度信息
73             Console.WriteLine($"value%");
74             if (value == 33)   //模拟 取消按钮处理
75             
76                 cts.Cancel();
77             
78             //Update the UI to reflect the progress value that is passed back.
79         

 参考:https://devblogs.microsoft.com/dotnet/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/

以上是关于小小一方士 C# AsyncAwait 之 上传/下载文件进度条实现原理的主要内容,如果未能解决你的问题,请参考以下文章

C#教程之打印和打印预览

javascript之分片上传,断点续传的实际项目实现

大天使之剑h5最强阵容

C#上位机开发一:串口通讯之如何制作一个串口调试助手

上传图片时等比缩放的一个小小算法

大数据生态之 ——HDFS