我正在尝试获取 WebClient 下载文件的当前下载速度,但是当我使用一个我确信应该可以计算出的公式时:
Stopwatch.Stop();
double msElapsed = Stopwatch.Elapsed.TotalMilliseconds;
int bytesDownloaded = (int)e.BytesReceived - lastBytesDownloaded;
double downloadSpeed = (double)bytesDownloaded / (msElapsed / 1000);
lastBytesDownloaded = (int)e.BytesReceived;
Stopwatch.Restart();
其中 Stopwatch 是我在开始文件下载时启动的秒表,lastBytesDownloaded 是一个类变量,这一切都在 downloadProgressChanged 事件内,但是下载速度与实际速度相差很大。
例如,如果我以 500kb/s 的速度下载文件,它会完全随机地从(例如)10kb/s 快速跳跃到 50mb/s。
通过对其进行一些编辑,我可以获得准确的平均下载时间:
double sElapsed = Stopwatch.Elapsed.TotalSeconds;
int bytesDownloaded = (int)e.BytesReceived;
double downloadSpeed = bytesDownloaded / sElapsed;
但这不是我想要的。如何获得更稳定的当前下载速度读数?
最佳答案
您只需要smooth较长一段时间内的数据。例如,不要仅根据最后一次测量来报告当前下载速度;使用(也许weighted)moving average相反。
简单的例子:
var measurements = 0, maxDataPoints = 5;
var dataPoints = new double[maxDataPoints];
然后:
Stopwatch.Stop();
double msElapsed = Stopwatch.Elapsed.TotalMilliseconds;
int bytesDownloaded = (int)e.BytesReceived - lastBytesDownloaded;
lastBytesDownloaded = (int)e.BytesReceived;
double dataPoint = (double)bytesDownloaded / (msElapsed / 1000);
dataPoints[measurements++ % maxDataPoints] = dataPoint;
double downloadSpeed = dataPoints.Average();
Stopwatch.Restart();
关于c# - WebClient DownloadDataAsync 当前下载速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212852/