我想以以下格式输出进程的剩余时间:
d hh:mm:ss
当进程开始时,它设置一个DateTime startTime
具有当前时间的变量。
从那里我的 GUI 上有一个计时器,它每秒更新一个标签,这是我必须计算的剩余时间:
TimeSpan timeRemaining = TimeSpan.FromTicks(DateTime.Now.Subtract(startTime).Ticks * (iProgress.Maximum - iProgress.Value) / iProgress.Value);
并在标签上使用:
labelTimeRemaining.Text = timeRemaining.ToString(@"d\ hh\:mm\:ss");
然而,显示的时间变化会非常奇怪地跳跃几分钟并进入稳定模式。
我知道它应该一开始就跳,但它应该在某个时候稳定下来,对吗?
我每秒处理大约 1~3 条记录,但是每次更新剩余的时间会增加 10~20 分钟。
我做错了什么或者我该如何解决这个问题?
如果您需要更多信息或代码,请告诉我。
更新
以下是我正在使用的部分代码:
private Stopwatch _timer = new Stopwatch();
private int _total = 0;
private int _current = 0;
使用以下命令启动线程或任务:
private void MyTask()
{
_timer.Reset();
_timer.Start();
for (int i = 0; i < _total; i++)
{
_current++;
Thread.Sleep(500);
}
_timer.Stop();
}
使用以下函数创建一个 winforms Timer 以每秒运行一次:
if (_timer.IsRunning && _current > 0)
{
float elapsedMin = ((float)_timer.ElapsedMilliseconds / 1000) / 60;
float minLeft = (elapsedMin / _current) * (_total - _current);
TimeSpan eta = TimeSpan.FromMinutes(minLeft);
iStatus.Text = eta.ToString(@"d\ hh\:mm\:ss");
}