c# - WebClient DownloadDataAsync 当前下载速度

标签 c# asynchronous download webclient

我正在尝试获取 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/

相关文章:

c# - 无法访问 Newtonsoft.Json.Linq.JValue 上的子值

asynchronous - Future 函数中的 SetState

cocoa - 在 Cocoa 中从网络异步加载图像

Android:加载数据然后通知 Activity ?还记录了一个失败的方法!

java - 从 MimeType 获取扩展名

c# - asp.net core mvc 表单 viewmodel 在帖子上为空

c# - 在 ASP.NET Core 2.2 中使用异步缩小 js

c# - 等待可观察完成

mysql - 在 Node.js 函数中处理多个相关查询

Python:用于下载有效 .zip 文件的跨平台代码