【问题标题】:WebClient DownloadDataAsync current download speedWebClient DownloadDataAsync 当前下载速度
【发布时间】: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


【解决方案1】:

您只需要smooth 较长时间的数据。例如,不要仅根据上次测量报告当前下载速度;请改用(可能是weightedmoving 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();

【讨论】:

  • 这太棒了,再加上我所做的另外一些调整(有时手表会报告
猜你喜欢
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多