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

关于上传下载文件(图片等),涉及到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/

原文地址:https://www.cnblogs.com/LPudding/p/11096237.html

时间: 2024-11-10 00:54:03

小小一方士 C# Async\Await 之 上传/下载文件进度条实现原理的相关文章

OSS 上传下载的进度条

ossClient.uploadFile和ossClient.downloadFile方法不支持进度条功能. 根据官方文档 https://help.aliyun.com/document_detail/84796.html?spm=a2c4g.11186623.6.791.40554d83cDiWSN 及代码示例制作加入进度条功能 https://github.com/aliyun/aliyun-oss-java-sdk/blob/master/src/samples/GetProgressS

字符串操作以及打印 —— 实现上传下载的进度条功能

import sys def processBar(num, total): rate = num / total rate_num = int(rate * 100) if rate_num == 100: r = '\r%s>%d%%\n' % ('=' * rate_num, rate_num,) else: r = '\r%s>%d%%' % ('=' * rate_num, rate_num,) sys.stdout.write(r) sys.stdout.flush process

SFTP上传下载文件

secureCRT SFTP上传/下载文件 远程登陆IP secureCRT会话中点击SFTP 3.cd  /home/dowload       linux平台切换到/home/dowload目录 4.cd d:\   windows平台切换到d盘 5.put 文件名           上传 /home/dowload目录下 6.get 文件名   下载文件到windows平台 d盘

Linux上传下载文件

2种方式:xftp(工具).lrzsz xftp:协议--SFTP.端口号--22 lrzsz: rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具. 优点就是不用再开一个sftp工具登录上去上传下载文件. sz(下载):将选定的文件发送(send)到本地机器 rz(上传):运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器 安装命令:yum install lrzsz 从服务端发送文件到客户端:sz filename 从客户端上传文件到服务

向云服务器上传下载文件方法汇总(转)

转载于:https://yq.aliyun.com/articles/64700 摘要: 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌面的时候,点"选项>>" 2."本地资源"-->详细信息. 3."磁盘驱动器"前面打钩. 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌

向linux服务器上传下载文件方式收集

向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 . 命令格式: scp [参数] <源地址(用户名@IP地址或主机名)>:<文件路径> <目的地址(用户名 @IP 地址或主机名)>:<文件路径> 举例: scp /home/work/source.

asp.net 文件批量选取,批量上传,带进度条,uploadify3.2 TOP

http://www.16aspx.com/Article/3444 asp.net 文件批量选取,批量上传,带进度条,uploadify3.2 TOP,布布扣,bubuko.com

rz和sz上传下载文件工具lrzsz

######################### rz和sz上传下载文件工具lrzsz ############################################################ 1 rpm -qa |grep lrzsz 如果没有用RPM安装即可: 2 rpm -ivh lrzsz-0.12.20-27.1.el6.x86_64.rpm (去光盘里找) 或者 yum install -y lrzsz 即可. ###########################

WebService中实现上传下载文件

不多说,直接看代码: /*上传文件的WebService*/ using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; using System.IO; /// <summ