繁体   English   中英

control.invoke()问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM