我有一个后台工作人员报告计算的进度。它返回在 ProgressChangedEventArgs 中正在处理的当前行号。我可以从那里确定通过做的百分比
(int) (100 * (double)e.ProgressPercentage / csTextLines)
其中 csTextLines 是我正在处理的行数。我遇到的麻烦是我想得到一个总估计时间和总剩余时间。我看到后台工作人员中没有任何东西可以帮助我,所以我想它必须通过 DateTime 计算来完成。这是我到目前为止所做的尝试获取 TotalEstTime 和 TimeLeft
- TimeLeft = TotalEstTime - TimeSoFar;
- TotalEstTime = AvgTimeForEachLine * #OfLines;
在哪里
- TimeSoFar = DateTime.Now - m_startTime;
- AvgTimeForEachLine = (TimeFromLastLine + TotalTimeForAllLines) / #OfLines;
在哪里
- TimeFromLastLine = DateTime.Now - LastRecordedTime;
- TotalTimeForAllLines += TimeFromLastLine;
所以如果我们把它变成我到目前为止的代码
// This event handler updates the progress.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
TimeSpan difInCalls = DateTime.Now.Subtract(m_LastProgressCall);
m_LastProgressCall = DateTime.Now;
m_totalDif = m_totalDif.Add(difInCalls);
TimeSpan avgDif = new TimeSpan(0, 0, 0, 0, ((int)m_totalDif.TotalMilliseconds / m_csNumLines));
double totalTime = m_csNumLines * avgDif.TotalSeconds;
double timeLeft = totalTime - (DateTime.Now.Subtract(m_Form2Start).TotalSeconds);
Console.WriteLine("TotalEstTime: " + totalTime + " TimeLeft: " + timeLeft);
// Update the progress label
resultLabel.Text = "Line " + e.ProgressPercentage.ToString() + " of " + m_csNumLines + " at " + (int)(100 * (double)e.ProgressPercentage / m_csNumLines) + "% loaded";
}
我遇到的问题是我的 TotalTime 随着处理的行数显着增加。在 1437 行字符串中,它开始时说我有 1.4 秒,最后估计还剩 18.6 秒。虽然实际上需要 16.54 秒才能完成。
我的第二个问题是剩下的时间并没有真正改变。它在大约 1.1 和 2.5 之间波动。
可以归因于什么?可能是什么问题呢?
这是完整的代码: http: //pastebin.com/x1CCceY7