【发布时间】:2014-01-17 21:56:41
【问题描述】:
我正在使用后台线程来运行我在标签上使用的秒表并增加进度条。计时器似乎准确地保持时间,但进度条没有达到我预期的 100%。
我正在尝试同时使用 35 秒,但在接近 36 秒时达到 100%,谁能告诉我为什么?
进度条最大值设置为350,值设置为0。
private int currentScore = 0;
Stopwatch swTimer = new Stopwatch();
private void backgroundWorkerTimer_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
TimeSpan elapsedTime = swTimer.Elapsed;
labelTime.Text = String.Format("{0}.{1:%f}", elapsedTime.Seconds, elapsedTime);
progressBarTimer.Increment(1);
}
private void backgroundWorkerTimer_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
backgroundWorkerTimer.ReportProgress(0);
System.Threading.Thread.Sleep(100);
}
}
【问题讨论】:
-
不清楚,你想让进度条在 35 秒后满吗?几秒钟后你就吃饱了?
-
是的,我希望它在 35 秒后充满,当它达到 100% 时,它接近 36。
-
我认为这是可以预料的。 Windows 不是实时操作系统,每次调用 ReportProgress 时都会进行线程切换。性能密集型操作,因此会丢失几毫秒,并且您可以观察到行为。不是该领域的专家,所以我可能被证明是错误的
-
不完全是史蒂夫。 Thread.Sleep 很可能是您的问题。该方法应该使您的线程停止运行至少 1000 毫秒,但它可以无限延迟执行多长时间。对于定期调用方法,您应该使用计时器。
-
labelTime 标签正在准确更新,并且在同一个地方被调用?
标签: c# progress-bar backgroundworker stopwatch