C# - 使用网络带宽计算下载/上传时间

时间:2009-10-19 07:13:45

标签: c# networking

作为我正在开发的应用程序中的一项功能,我需要显示上传/下载文件到服务器/从服务器下载的总估计时间。

如何从客户端计算机上获取下载/上传速度到服务器。

我认为如果我能够获得速度,那么我可以通过 - >

来计算时间
  

例如---对于200 Mb文件= 200(1024 kb)= 204800 kb和   除以204800 Mb /速度Kb / s =“x”秒

6 个答案:

答案 0 :(得分:11)

上传/下载速度不是服务器的静态属性,它取决于您的特定连接,也可能随时间而变化。我见过的大多数应用程序都会在短时间内进行估算。这意味着他们开始下载/上传并测量数据量,比方说10秒。然后将其作为当前传输速度并用于计算剩余时间(例如2500kB / 10s-> 250Kb / s)。移动时间窗口并连续重新计算,以使计算精确到当前速度。

虽然这是一种非常基本的方法,但它在大多数情况下都能很好地发挥作用。

答案 1 :(得分:3)

这只是切线相关,但我假设如果你试图计算剩余的总时间,你可能也会将它显示为某种进度条。如果是这样,你应该阅读克里斯哈里森关于感知差异的这篇论文。以下结论直接来自他的论文(强调我的)。

  

不同的进度条行为似乎对用户对流程持续时间的感知有显着影响。通过最小化负面行为并纳入积极行为,可以有效地使进度条及其相关流程显得更快。此外,如果可以重新排列多级操作的元素,则可以以更令人愉悦且看似更快的顺序对阶段进行重新排序。

http://www.chrisharrison.net/projects/progressbars/ProgBarHarrison.pdf

答案 2 :(得分:2)

尝试这样的事情:

int chunkSize = 1024;
int sent = 0
int total = reader.Length;
DateTime started = DateTime.Now;
while (reader.Position < reader.Length)
{
    byte[] buffer = new byte[
        Math.Min(chunkSize, reader.Length - reader.Position)];
    readBytes = reader.Read(buffer, 0, buffer.Length);

    // send data packet

    sent += readBytes;
    TimeSpan elapsedTime = DateTime.Now - started;
    TimeSpan estimatedTime = 
        TimeSpan.FromSeconds(
            (total - sent) / 
            ((double)sent  / elapsedTime.TotalSeconds));
}

答案 3 :(得分:0)

我不知道你为什么需要这个,但我会尽可能简化并询问用户他有什么样的连接类型。然后取文件大小除以速度,然后除以8得到秒数。

重点是你不需要处理能力来计算速度。 Microsoft在其网站上使用的功能可根据文件大小计算大多数默认连接的速度,您可以在上传文件或手动输入文件时获得该文件大小。

同样,也许你有其他需求,你必须在飞行中计算上传...

答案 4 :(得分:0)

以下代码计算剩余时间(分钟)。

    long totalRecieved = 0;
    DateTime lastProgressChange = DateTime.Now;
    Stack<int> timeSatck = new Stack<int>(5);
    Stack<long> byteSatck = new Stack<long>(5);

    using (WebClient c = new WebClient())
    {
        c.DownloadProgressChanged += delegate(object s, DownloadProgressChangedEventArgs args)
        {
            long bytes;

            if (totalRecieved == 0)
            {
                totalRecieved = args.BytesReceived;
                bytes = args.BytesReceived;
            }
            else
            {
                bytes = args.BytesReceived - totalRecieved;
            }

            timeSatck.Push(DateTime.Now.Subtract(lastProgressChange).Seconds);
            byteSatck.Push(bytes);

            double r = timeSatck.Average() * ((args.TotalBytesToReceive - args.BytesReceived) / byteSatck.Average());
            this.textBox1.Text = (r / 60).ToString();

            totalRecieved = args.BytesReceived;
            lastProgressChange = DateTime.Now;
        };

        c.DownloadFileAsync(new Uri("http://www.visualsvn.com/files/VisualSVN-1.7.6.msi"), @"C:\SVN.msi");
    }

答案 5 :(得分:0)

我想我已经有了下载的预计时间。

double timeToDownload = ((((totalFileSize/1024)-((fileStream.Length)/1024)) / Math.Round(currentSpeed, 2))/60);
this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { 
Math.Round(currentSpeed, 2), Math.Round(timeToDownload,2) });

,其中

private void UpdateProgress(double currentSpeed, double timeToDownload)
    {

        lblTimeUpdate.Text = string.Empty;
        lblTimeUpdate.Text = " At Speed of " + currentSpeed + " it takes " + timeToDownload +"   minute to complete download";
    }

和当前速度计算如

TimeSpan dElapsed = DateTime.Now - dStart;
if (dElapsed.Seconds > 0) {currentSpeed = (fileStream.Length / 1024) / dElapsed.Seconds;
                                }