我正在编写一个图书馆,意图在桌面(.Net 4.0及更高版本),手机(WP 7.5及以上版本)和 Windows Store(Windows 8及更高版本)应用程序中使用它.

该库能够使用Portable HttpClient库从Internet下载文件,并报告下载进度.

我在这里和互联网的其余部分搜索有关如何实施进度报告的文档和代码示例/指南,这次搜索使我无处可去.

有没有人有文章,文档,指南,代码示例或其他什么来帮助我实现这一目标?

解决方法

我编写了以下代码来实现进度报告.代码支持我想要的所有平台;但是,您需要引用以下NuGet包:

> Microsoft.Net.Http
> Microsoft.Bcl.Async

这是代码:

public async Task DownloadFileAsync(string url,IProgress<double> progress,CancellationToken token)
{
    var response = await client.GetAsync(url,HttpCompletionoption.ResponseHeadersRead,token);

    if (!response.IsSuccessstatusCode)
    {
        throw new Exception(string.Format("The request returned with HTTP status code {0}",response.StatusCode));
    }

    var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L;
    var canReportProgress = total != -1 && progress != null;

    using (var stream = await response.Content.ReadAsstreamAsync())
    {
        var totalRead = 0L;
        var buffer = new byte[4096];
        var isMoretoRead = true;

        do
        {
            token.ThrowIfCancellationRequested();

            var read = await stream.ReadAsync(buffer,buffer.Length,token);

            if (read == 0)
            {
                isMoretoRead = false;
            }
            else
            {
                var data = new byte[read];
                buffer.ToList().copyTo(0,data,read);

                // Todo: put here the code to write the file to disk

                totalRead += read;

                if (canReportProgress)
                {
                    progress.Report((totalRead * 1d) / (total * 1d) * 100);
                }
            }
        } while (isMoretoRead);
    }
}

使用它很简单:

var progress = new Microsoft.Progress<double>();
progress.ProgressChanged += (sender,value) => System.Console.Write("\r%{0:N0}",value);

var cancellationToken = new CancellationTokenSource();

await DownloadFileAsync("http://www.dotpdn.com/files/Paint.NET.3.5.11.Install.zip",progress,cancellationToken.Token);

c# – 如何实现Portable HttpClient的进度报告的更多相关文章

  1. 浅谈HTML5 FileReader分布读取文件以及其方法简介

    本篇文章主要介绍了浅谈HTML5 FileReader分布读取文件以及其方法简介,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. ios – 使用MonoTouch,HttpClient和Charles Proxy时的HTTP流量监控问题

    我是HttpClient类的新手,我遇到了使用CharlesProxy监视请求的问题.基本上我需要的是监视从模拟器或实际iOS设备发出的请求.Here您可以找到有关如何配置CharlesforiOS开发的精彩教程.我正在制作简单的HttpClient请求,只是一个简单的授权代码有效,用户正在被授权,并且正在返回承载令牌.但是问题是,我在模拟器上的请求没有出现在Charleshttp流量监控列表中.

  3. ios – 在导航栏下添加进度条

    我是iOS开发的新手.我想知道在iOS7中是否在UINavigationBar下发送消息时,其标题为:发送,有一个进度条正在加载,直到消息成功发送.我的问题是:>那个酒吧是进度条吗?有人可以给我一些关于如何在iOS7和iOS6上创建它的想法吗?

  4. ios – 当应用程序强制退出时如何恢复下载?

    )方法PS:谢谢你的回答我明白我的帖子有多么误导性.我会尝试工作的框架,可以允许恢复下载后,应用程序强制退出

  5. ios – 如何在UIProgressView中设置进度色调

    我想知道如何设置UIProgressView色调颜色.有时,根据颜色,默认高度不允许正确查看进度.如何解决这个问题?解决方法您可以通过此设置曲线和进度条的色调颜色;对于轨道颜色:进度条:希望这可以帮助..:)

  6. ios – 进度视图未更新 – Swift

    我正在使用Swift中的ProgressView这是我的代码即使完整提供此输出它不会在此更新进度视图解决方法针对Swift3进行了更新对UI的更改应始终发生在主/前台线程上,在这种情况下,它发生在后台队列上.使用:把它移到前台.前Swift3的旧答案对UI的更改应始终发生在主/前台线程上,它发生在后台队列上.使用:把它移到前台.

  7. ios – NSProgress奇怪的行为

    我有一个由几个子任务组成的大任务.我想为这项重大任务添加进度报告.为此,我想使用nsprogress,并根据类文档,我可以通过使用其子–父机制来做这种子任务进展.所以为了简化它,让我说我有一个由一个子任务组成的大任务.这就是我所做的:如您所见,子任务使用背景上下文来运行一些与CoreData相关的代码,而后台上下文使用主上下文作为其父上下文.这会导致进度的“fractionCompleted”属性出现一些奇怪的KVO.这是印刷品:如你所见,打印以1.0,0.5和1.0开始,然后是0.66?

  8. swift爬行篇 滑块,进度条,步进,

    滑块1.创建continous属性为true:滑块在滑动过程中响应事件,为false时则只在滑动后响应事件2.设置各区域的图片3.响应事件和Tag4.获取滑块的值进度条1创建2.设置步进控件1.创建2.响应事件continuous属性UiSlider类似3.获取步进的值

  9. Swift - 进度条UIProgressView的用法

    overridefuncviewDidLoad(){//这里放置步骤二的代码即可}二、在函数中创建进度条控件progress=UIProgressViewprogress.progress=0progress.progresstintColor=UIColor.redColor()progress.trackTintColor=UIColor.blackColor()self.view.addSubviewtimer=NSTimer.scheduledTimerWithTimeIntervaltimer.

  10. Swift UISwitch/UIProgressView/UISlider

    1.UISwitch开关视图,可以让用户快速的开关一个功能,比如蓝牙,wif等.系统默认样式:上面绿色的开启状态,下面的是关闭状态.UISwitch的构成部分:UISwitch的大小是W51H31,这固定在,在设置它的frame的时候可以不设置其大小.为什么是固定的呢?

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部