gpt4 book ai didi

c# - 计算后台工作人员 OnProgressChanged 事件的总剩余时间和总时间

转载 作者:行者123 更新时间:2023-11-30 15:03:04 25 4
gpt4 key购买 nike

我有一个后台工作人员报告计算进度。它在 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.54s 才能完成。

我的第二个问题是剩下的时间并没有真正改变。它在大约 1.1 和 2.5 之间波动。

可以归因于什么?可能是什么问题?

这是完整的代码:http://pastebin.com/x1CCceY7

最佳答案

问题是您计算的是上次进度时间,该时间可能会随着您的进展而波动。如果您从开始时间和当前时间开始工作,并使用完成百分比,那么您会发现时间会随着您的移动而“ self 调整”。

例如,如果您将 DateTime.Now 存储到一个变量中(例如 m_operationStart,使用您的命名),您可以这样写:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage != 0)
{
double percentageComplete = (double)e.ProgressPercentage / m_csNumLines;

TimeSpan timeSinceStart = DateTime.Now.Subtract(m_operationStart);
TimeSpan totalTime = TimeSpan.FromMilliseconds(timeSinceStart.TotalMilliseconds / percentageComplete);
TimeSpan timeLeft = totalTime - timeSinceStart;

Console.WriteLine("TotalEstTime: " + totalTime + " TimeLeft: " + timeLeft);


// Update the progress label
resultLabel.Text = "Line " + e.ProgressPercentage.ToString() + " of " + m_csNumLines + " at " + (int)(100.0 * percentageComplete) + "% loaded";
}
else
resultLabel.Text = "Line " + e.ProgressPercentage.ToString() + " of " + m_csNumLines;
}

关于c# - 计算后台工作人员 OnProgressChanged 事件的总剩余时间和总时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com