【问题标题】:How to get estimated download time [duplicate]如何获得估计的下载时间[重复]
【发布时间】:2021-05-31 00:01:36
【问题描述】:

所以,我在 C# winforms 中创建了一个 Web 浏览器,对于下载表单,我需要获取估计的下载时间。我正在使用 System.Net.WebClient 类进行下载。到目前为止的代码如下:

private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
   Invoke(new MethodInvoker(delegate ()
   {
        progressBar1.Minimum = 0;
        double recieve = double.Parse(e.BytesReceived.ToString());
        double total = double.Parse(e.TotalBytesToReceive.ToString());
        double percentage = recieve / total * 100;
        label7.Text = percentage.ToString() + "% complete";
        progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
    }));
}

【问题讨论】:

  • 你不能不下载一些数据。一个 URL 有多个跃点。速率将是连接中最慢的一跳。所以有些跃点可能是 10M,有些是 100M,还有一些在光纤上。
  • 可以通过多种方式计算估算值,但您不太清楚您要寻找哪种方法。例如,您可以说timeTakenSoFar / percentReceived 或一些计算最后一秒的下载速度乘以仍然丢失的数据量。考虑到它的波动幅度,估计值是否有用?
  • 你为什么要在那里调用?该事件在同一个线程上引发,因此现在您在 UI 线程上调用 Invoke()。不要那样做。

标签: c# winforms


【解决方案1】:

只有下载了其中的一部分后,您才能估计时间。开始下载时启动StopWatch

private readonly StopWatch _stopWatch = new();
private long _totalBytesReceived;

开始下载

_stopWatch.Restart();
_totalBytesReceived = 0;
StartDownloading();

Client_DownloadProgressChanged:

long received = e.BytesReceived;
_totalBytesReceived += received;
long totalEstimatedMilliseconds =
    _stopWatch.ElapsedMilliseconds * e.TotalBytesToReceive / _totalBytesReceived;

所有这些数字都以long 给出。将它们转换为 string 只是为了将它们解析为 double 并稍后截断 double 并再次转换为字符串以进行显示是没有意义的。在整个过程中保持longlong 始终是整数,不需要截断。


您可以免费获得百分比,因为DownloadProgressChangedEventArgs ClassProgressPercentage Property。 Intellisense 揭示了这一点。 (你还是要这样计算估计时间)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多