作为我正在开发的应用程序中的一项功能,我需要显示上传/下载文件到服务器/从服务器下载的总估计时间。
如何从客户端计算机上获取下载/上传速度到服务器。
我认为如果我能够获得速度,那么我可以通过 - >
来计算时间例如---对于200 Mb文件= 200(1024 kb)= 204800 kb和 除以204800 Mb /速度Kb / s =“x”秒
答案 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;
}