c# - WebClient DownloadFile 显示错误的百分比

标签 c# webclient

我正在使用 System.Net.WebClient 在我的应用程序中异步下载文件。出于某种原因,在某些系统上百分比计算错误。

我的(更新的)DownloadProgressChanged 事件:

WebClient client = new WebClient();
client.DownloadProgressChanged += (_sender, _e) => {
    double bytesIn = _e.BytesReceived;
    double totalBytes = _e.TotalBytesToReceive;
    double percentage = bytesIn / totalBytes * 100;
    UpdateConnectingStatus("Missionsdatei wird heruntergeladen... (" + Math.Truncate(percentage).ToString() + "%)");
};

它应该是什么样子(Windows 8.1 64 位):

How it should look like

它在某些系统(Windows 7 64 位)上的外观:

How it looks on some systems

会不会跟操作系统有关?或者有什么其他想法?

更新:我完全删除了除法 (/1000000),但它在同一系统上都不起作用。

更新 2:我检查了 totalBytes 的值。在它不起作用的系统上,totalBytes 的结果是 -1。任何想法为什么会这样?

更新 3:尽管我尝试删除字符串转换内容并向分区添加 .0,但我仍然没有解决方案。我认为这取决于该人拥有的慢速互联网连接,它不起作用。我现在只显示百分比,如果它是积极的。

最佳答案

根据一些网络搜索和我的反编译器 TotalBytesToReceive 如果下载的大小(尚)未知,则可以为 -1。 (是的,这是可怕的 API 设计。)

-1 案例的守卫:

if (TotalBytesToReceive == -1)
 Print("Download in Progress");
else
 Print(e.ProgressPercent);

目前还不清楚为什么不知道那台机器上的下载大小。可能有一个 HTTP 代理删除了 Content-Length header ,或者 Web 服务器由于某种原因没有发送它。

关于c# - WebClient DownloadFile 显示错误的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226077/

相关文章:

c# - 获取给定某一天的一周中的天数范围

c# - 如何在 C# winform 应用程序中将子窗口置于最前面?

c# - 在浏览器端拦截 HTTP 请求以更改一些 html 内容

ssl - 无法从 Dropbox 下载文件,因为无法通过 C# 中的 WebClient 连接 SSL/TLS channel

c# - 文件流或 WebClient

c# - .Net core 2 Web api 未将配置注入(inject)服务

c# - 带有 BackgroundWorker 的 Lambda

c# - WebClient下载文件异步不起作用

c# - 无法从传输连接读取数据 :An existing connection was forcibly closed by the remote host

ssl - Windows Phone 8 信任 SSL 证书的问题