C #, расчет скорости загрузки, где проблема? - PullRequest
1 голос
/ 26 августа 2011

Я хочу рассчитать скорость загрузки в кбит / с (кб в секунду). В коде есть проблема, он не показывает фактическую скорость. И я очень устал от этой работы. Кроме того, при использовании формулы (TotalDownloadSize / ElapsedTime) она показывает более реалистичные результаты, но вы знаете, что она получит среднее значение и будет глупостью.

Обычно он дает 4000, и это в основном из-за фрагмента 4096, когда я устанавливаю его на 128, тогда я получаю значения 50/100/125.

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 ]

2 голосов
/ 26 августа 2011

Так в чем же проблема?

Вы грубо пробуете что-то, что сильно варьируется.

Рассмотрим буферизацию измерений и усреднение последних 5 или около того. Ищите реализации "скользящего среднего".

1 голос
/ 26 августа 2011

Ну, мой первый комментарий: ваш код не является потокобезопасным, поэтому, когда вы устанавливаете dlElapsed = DateTime.Now;, это не то же самое значение dlElapsed, которое UpdateProgress будет проверять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...