【问题标题】:RunWorkerCompleted updates UI before DoWork has finishedRunWorkerCompleted 在 DoWork 完成之前更新 UI
【发布时间】:2013-08-03 07:52:41
【问题描述】:

我很想知道为什么 RunWorkerCompleted 实际上会在进度条完成之前更新 UI,textBox1 文本为“完成”。为什么会这样?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();

    }


    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 100; i++)
        {
            Thread.Sleep(10);
            backgroundWorker1.ReportProgress(i);

        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

        progressBar1.Value = e.ProgressPercentage;

    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        textBox1.Text = "Done";
    }

如果我使用

    for (int i = 1; i <= 100; i++)
        {
            Thread.Sleep(20);
            backgroundWorker1.ReportProgress(i);
            MessageBox.Show(i.ToString());
        }

然后它会做我期望的事情

如果我在下面尝试这个,文本框会按预期更新,但进度条不会更新

 public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {


        progressBar1.Value = e.ProgressPercentage;
        textBox1.Text = e.ProgressPercentage.ToString();
        progressBar1.Refresh();
    }

【问题讨论】:

  • 好吧,你也检查过它的进度吗(在一些输出控件中,比如文本框)
  • 这应该不会发生,你检查过写日志吗?
  • 如果我添加一个消息框来显示进度条更新的每次迭代,“完成”会在最后一个消息框显示后出现。如果我不这样做,那么在 UI 更新所有进度条之前会出现“完成”! for (int i = 1; i
  • 在进度条完成之前更新 UI - 多少?你的整个循环只需要 1 秒
  • 大约 0.3 / .4 秒

标签: c# multithreading user-interface


【解决方案1】:

有点滞后是可能的,也是可以预料的。

ReportProgress() 机制可能使用BeginInvoke(),因此更新是排队的。这会带来一点延迟,但通常不会引起注意。

ProgressBar 有自己的内部更新机制。这似乎故意将反馈延迟几百毫秒。我猜是一些用户缩放的调整。

【讨论】:

  • 考虑到参数,滞后是相当大的。即使我尝试 if (progressBar1.Value ==100) textBox1.Text = "Done";它的进度条仍然滞后。我能做些什么来纠正这个问题?
  • 您可以尝试减少对 ReportProgress 的调用(可能还有其他 BeginInvoke 调用)。下一步是:查找或编写另一个进度条。
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多