我正在尝试在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下载剩余时间的最佳方法吗?
答案 0 :(得分:1)
var elapsedTime = DateTime.Now.Second - _startTime.Second;
DateTime.Second
仅返回秒组件,表示为介于0和59之间的值。这可能导致高度意外的行为,因为63秒的延迟将被视为仅持续3秒(模60) )。
您需要小心使用全时组件。例如,您可以使用TimeSpan.TotalSeconds
:
var elapsedTime = (DateTime.Now - _startTime).TotalSeconds;