[英]control.invoke() issue
我试图在一个单独的线程上进行一些数据类型检查时更新进度条,似乎进度条的值与实际显示的值之间存在延迟。
以下代码由非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();
}
}
我上传了一个显示进度条和实际值的屏幕截图。 有任何想法吗???
谢谢
进度栏是对用户的简单反馈,而不是精确的工具。 这是奶嘴。
它还合并了自己的异步逻辑来更新屏幕(与消息循环无关)。 这使得它可能会落后一些。
有什么大不了的?
为了获得更准确的结果,请将范围划分为<100个细分,并减少更新。
延迟是很正常的。 毕竟,在UI线程中调用方法意味着Windows将调度一条消息,并且如果您的线程足够快(并且占用CPU),则它的显示速度将比UI快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.