我尝试在单独的线程上执行某些数据类型检查时更新进度条,并且似乎在进度条的值与实际显示的值之间存在延迟。
以下代码由非GUI线程执行,用于引发事件。
protected virtual void OnUpdateProgressBar(object sender, ProgressBarEventArgs e)
{
EventHandler<ProgressBarEventArgs> TempHandler = UpdateProgressBar;
//Avoid possible race condition.
if (TempHandler != null)
{
TempHandler(this, e);
}
}
我已经创建了一个单独的类来更新进度条,当我创建它的实例时,我将引用传递给进度条。以下是整个班级。
public class ProgressBarChanged
{
ProgressBar statusBar;
public ProgressBarChanged(ProgressBar pb)
{
statusBar = pb;
statusBar.Value = 0;
}
public ProgressBarChanged()
{
}
public void subscribeToEvent(DataVerification test)
{
test.UpdateProgressBar += new EventHandler<ProgressBarEventArgs>(incrementPB);
}
public void incrementPB(object sender, ProgressBarEventArgs e)
{
Action action = () =>
{
if (e.CurrentRow == e.FinalRow - 10)
{
int i = 5;
}
statusBar.Maximum = e.FinalRow;
statusBar.Value = e.CurrentRow;
};
if(statusBar.InvokeRequired)
statusBar.Invoke(action);
else
action();
}
}
我上传了一个显示进度条和实际值的屏幕截图。 任何想法???
谢谢
答案 0 :(得分:3)
progessbar是对用户的简单反馈,而不是一个精确的仪器。这是一个安抚奶嘴。
它还结合了自己的异步逻辑来更新屏幕(独立于消息循环)。这使它可能会落后一点。
有什么大不了的?
要获得更准确的结果,请将您的范围划分为&lt; 100个细分,做更少的更新。
答案 1 :(得分:0)
延迟很正常。毕竟,在UI线程中调用一个方法意味着Windows将调度一条消息,如果你的线程足够快(并且CPU消耗),那么它看起来比UI快。