【问题标题】:WebClient DownloadFile displaying wrong percentageWebClient DownloadFile 显示错误的百分比
【发布时间】:2015-07-04 23:56:09
【问题描述】:

我正在使用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 64bit):

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

这可能与操作系统有关吗?还是有其他想法?

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

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

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

【问题讨论】:

  • 尝试除以 1000000.0(带小数点)。该代码可能正在执行整数除法并截断部分结果。奇怪的结果是一个很大的负数,MSB 十六进制数是 0xFFFFFF。看起来除法给出的是整数而不是浮点数。
  • "会不会和操作系统有关?"不,99.999999% 的确定性是您的错误。使用调试器查看在哪些点计算值不正确。那个有趣的字符串转换可能是问题所在,无论如何你都应该删除它。
  • 如果你显示的只是一个百分比,你为什么要除以1000000?为什么要使用ToString() 然后解析字符串?正确投射或转换它。
  • 看到你的更新:也许你应该接受提示并删除那些野字符串转换的东西。或者,使用调试器检查更多值。
  • 查看您最近的编辑:您仍然没有完成所要求的内容以及可能的解决方案。您也没有对 cme​​ts 做出反应。由于您仍在积极寻找解决方案,我真的不明白您为什么拒绝您要求的帮助。你给自己带来痛苦。

标签: c# webclient


【解决方案1】:

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

保护 -1 情况:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多