C#,计算下载速度,问题在哪里?

时间:2011-08-26 10:29:55

标签: c# networking download

我想将下载速度计算为kbps(每秒kb)。代码中存在问题,它没有显示实际速度。我真的厌倦了这项工作。此外,当使用(TotalDownloadSize / ElapsedTime)公式时,它会显示更逼真的结果,但您知道它会获得平均值并且它将是愚蠢的。

它通常会给出4000并且它基本上是因为当我将其设置为128时我得到50/100/125值时的块4096。

DateTime dlElapsed;
private delegate void UpdateProgessCallback(Int64 BytesRead, Int64 TotalBytes, Int32 CurrentBytes);
private void UpdateProgress(Int64 BytesRead, Int64 TotalBytes, Int32 CurrentBytes)
{
    DateTime Elapsed = DateTime.Now;
    var progress = Convert.ToInt32((BytesRead * 100) / TotalBytes);
    var elaps = (Elapsed - dlElapsed).TotalSeconds;
    long kbps;

    if (elaps > 0)
    {
        kbps = Convert.ToInt64((CurrentBytes / elaps) / 1024);
        updateLabelText(String.Format("Downloading ({0} kbps)...", kbps));
    }
    // Make progress on the progress bar
    if (progress < progressBar1.Maximum)
    {
        progressBar1.Value = progress;

    }
    else
    {
        progressBar1.Value = progressBar1.Maximum;
    }
    dlElapsed = DateTime.Now;
}

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    // Some stuff here...
    int byteSize = 0;
    byte[] downBuffer = new byte[4096];

    FileStream strLocal= new FileStream(path, FileMode.Create, FileAccess.Write);
    dlElapsed = DateTime.Now;
    while ((byteSize = stream.Read(downBuffer, 0, downBuffer.Length)) > 0)
    {
        strLocal.Write(downBuffer, 0, byteSize);
        this.Invoke(new UpdateProgessCallback(this.UpdateProgress), 
            new object[] { strLocal.Length, totalbyte, byteSize});
    }
    updateLabelText("Download complete!");
    strLocal.Close();
    }

}

那么问题出在哪里?

2 个答案:

答案 0 :(得分:2)

  

那么问题出在哪里?

你正在粗略地抽样变化很大的东西。

考虑缓冲测量并平均最后5个左右。寻找“运行平均值”的实现。

答案 1 :(得分:1)

好吧,我的第一条评论是你的代码不是线程安全的,所以当你设置dlElapsed = DateTime.Now;时,它与dlElapsed将要检查的UpdateProgress值不同。