C# 计算当前(非平均)下载速度

C# 计算当前(非平均)下载速度,c#,download,download-manager,C#,Download,Download Manager,在我的下载管理器应用程序中,我使用以下代码计算当前传输速率: TimeSpan interval = DateTime.Now - lastUpdateTime; downloadSpeed = (int)Math.Floor((double)(DownloadedSize + cachedSize - lastUpdateDownloadedSize) / interval.TotalSeconds); lastUpdateDownloade

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

        TimeSpan interval = DateTime.Now - lastUpdateTime;

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

        lastUpdateDownloadedSize = DownloadedSize + cachedSize;
        lastUpdateTime = DateTime.Now;
这主要是按照我想要的方式工作的(我每4秒左右更新一次速度),但是下载速度总是会有一些疯狂的波动。我的平均下载速度约为600kb/s,有时显示为10.25mb/s,甚至是-2093848b/s之类的负值。这怎么可能

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

鉴于“实时”是不可能实现的,您应该尝试模拟它,使间隔尽可能小和精确,并计算整个间隔的平均值,检查代码是否正常。例如:

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;
您的代码有一个区别:

  • 现在只计算一次,使用两次

  • 您应该使用DateTime.UtcNow而不是DateTime。现在,它一年不会更改两次。您的计算是否有效地抵消了下载的大小/间隔。TotalSeconds?在微积分书或在线上查找瞬时变化率。您没有向我们显示足够的代码来说明为什么您可能会得到负数。下载大小是如何计算的?
    cachedSize
    在此处使用后是否归零?正如@spender提到的,您应该改变计算已用时间的方式,尽管
    DateTime.UtcNow
    并不是比
    DateTime.Now更好的选择。看看为什么。@spender-不,它不会像那样抵消。Jim Mischel-下载缓存写入本地文件时,DownloadedSize随CachedSize一起递增。最大缓存大小为1MB。我认为这方面没有问题。谢谢你的建议,我会考虑使用秒表代替基于系统的时间间隔,每秒钟计算一次速率,而不是每几毫秒似乎是治愈这些尖峰的方法。我不同意你使用总毫秒超过总秒数的理由。两者都由双精度浮点数表示。将不会有任何损失的精度更喜欢一个比另一个。。。您只是添加了更多的计算。感谢saverio,我认为时间间隔存在一些问题,因为此速度计算是每隔几毫秒进行一次的。现在我每隔一秒左右计算一次,速度没有大的峰值。