计算当前(不是平均)下载速度

mar*_*rko 5 c# download download-manager

在我的下载管理器应用程序中,我正在使用以下代码来计算当前传输速率:

        TimeSpan interval = DateTime.Now - lastUpdateTime;

        downloadSpeed = (int)Math.Floor((double)(DownloadedSize + cachedSize - lastUpdateDownloadedSize) / interval.TotalSeconds);

        lastUpdateDownloadedSize = DownloadedSize + cachedSize;
        lastUpdateTime = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

这通常可以按我想要的方式工作(我每4秒左右更新一次速度),但是随着下载速度的波动,下载率始终会出现一些疯狂的峰值。我的平均下载速度约为600 kB / s,有时它显示为10.25 MB / s,甚至是负值,如-2093848 B / s。怎么会这样

计算实时下载率的最佳方法是什么?我对平均速率(DownloadedSize / TimeElapsed.TotalSeconds)不感兴趣,因为它无法给出真实的结果。

rew*_*ten 4

鉴于“实时”是无法实现的,您应该尝试模拟它,方法是使间隔尽可能小和精确,并计算间隔上的平均值,检查代码的完整性。例如:

DateTime now = DateTime.Now;
TimeSpan interval = now - lastUpdateTime;
timeDiff = interval.TotalSeconds;
sizeDiff = DownloadedSize + cachedSize - lastUpdateDownloadedSize;
speed = (int)Math.Floor((double)(sizeDiff) / timeDiff);
lastUpdateDownloadedSize = DownloadedSize + cachedSize;
lastUpdateTime = now;
Run Code Online (Sandbox Code Playgroud)

与您的代码的一处区别:

  1. 现在只计算一次,使用两次。

  • 我不同意您使用 TotalMilliseconds 而不是 TotalSeconds 的理由。两者都用双精度浮点数表示。相对于另一种,不会有任何精度损失……您只是添加更多计算。 (2认同)