C#WebClient下载时间

时间:2015-08-08 05:44:41

标签: c# webclient

我正在尝试在C#下载表单中显示Time Left Label,这与Chrome之类的浏览器类似。我已经尝试了以下基于Java回答同样问题的堆栈溢出,但它确实不稳定:转到底片,小时数上下快速相同的分钟等。

var elapsedTime = DateTime.Now.Second - _startTime.Second;
var allTimeFordownloading = (elapsedTime * e.TotalBytesToReceive / e.BytesReceived);
var remainingTime = allTimeFordownloading - elapsedTime;
TimeSpan time = TimeSpan.FromSeconds(remainingTime);
TimeRemaining.Text = string.Format("Time Remaining: {0} Minutes, {1} Seconds", time.Minutes, time.Seconds);

Progress.Value = e.ProgressPercentage;
DownloadPercentage.Text = string.Format("{0}/100%", e.ProgressPercentage);
if (e.BytesReceived < 1024)
     BytesLeft.Text = string.Format("{0}/{1} KBs", Math.Round(e.BytesReceived / 1024f), Math.Round(e.TotalBytesToReceive / 1024f));
 else
     BytesLeft.Text = string.Format("{0}/{1} MBs", (Math.Round((e.BytesReceived / 1024f) / 1024f)), Math.Round((e.TotalBytesToReceive / 1024f) / 1024f));

_startTime是在调用DownloadFileAsync方法之前启动的DateTime。 Progress是我表单上ProgressBar的名称,e是传递给事件处理程序的DownloadProgressChangedEventArgs对象。

编辑: 我的问题是计算C#WebClient下载剩余时间的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

var elapsedTime = DateTime.Now.Second - _startTime.Second;

DateTime.Second仅返回秒组件,表示为介于0和59之间的值。这可能导致高度意外的行为,因为63秒的延迟将被视为仅持续3秒(模60) )。

您需要小心使用全时组件。例如,您可以使用TimeSpan.TotalSeconds

var elapsedTime = (DateTime.Now - _startTime).TotalSeconds;