【发布时间】:2013-10-06 19:15:27
【问题描述】:
我正在尝试获取 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;
但这不是我想要的。如何获得更稳定的当前下载速度读数?
【问题讨论】:
-
你想做一个移动平均线,Rx.NET 是一个非常好的方法。 PS 感谢这个例子,我将不得不在下个月为 RxJS 演讲偷这个例子:P Check out this example.
标签: c# asynchronous download webclient