C# 在进度条达到100%之前触发RunWorkerCompleted

C# 在进度条达到100%之前触发RunWorkerCompleted,c#,winforms,progress-bar,backgroundworker,C#,Winforms,Progress Bar,Backgroundworker,我正在做我的第一个WinForms应用程序,它有一个后台工作程序和进度条。当我运行代码时,进度条似乎被延迟了,因为在执行RunWorkerCompleted的代码时,它的动画(接近100%)没有完成。(几百毫秒后,进度条将被填满。) 有没有办法使事情更加同步 从用户的角度来看,我希望进度条在其他事情开始发生之前达到100% 下面的componentList.Count通常为5-15,这意味着进度动画每增加一次大约跳跃10-20% 我的代码: private void ExecuteBut

我正在做我的第一个WinForms应用程序,它有一个后台工作程序和进度条。当我运行代码时,进度条似乎被延迟了,因为在执行RunWorkerCompleted的代码时,它的动画(接近100%)没有完成。(几百毫秒后,进度条将被填满。) 有没有办法使事情更加同步

从用户的角度来看,我希望进度条在其他事情开始发生之前达到100%

下面的componentList.Count通常为5-15,这意味着进度动画每增加一次大约跳跃10-20%

我的代码:

    private void ExecuteButton_Click(object sender, EventArgs e)
    {
        ExecuteButton.Enabled = false;
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int filesRun = 0;
        foreach(string file in componentList)
        {
            api.ExecuteInstructions(file);
            int progress = ++filesRun * 100 / componentList.Count;
            backgroundWorker1.ReportProgress(progress);
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        ExecuteButton.Enabled = true;
    }
我目前的解决方案给人的印象是同时性:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int filesRun = 0;
        foreach(string file in componentList)
        {
            api.ExecuteInstructions(file);
            int progress = ++filesRun * 100 / componentList.Count;
            if(progress == 100)
                progress--;

            backgroundWorker1.ReportProgress(progress);
        }

        Thread.Sleep(650); // cosmetic paus
        backgroundWorker1.ReportProgress(100);
    }
更新:

使用问题“更改值时禁用.NET progressbar动画”中建议的技巧,我通过使用现有实现,然后添加以下逻辑,成功地解决了我的问题:

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;

        if (e.ProgressPercentage == 100)
        {
            progressBar1.Value = 101;
            progressBar1.Maximum = 100;
            progressBar1.Value = 100;
        }
    }

做一个简单的技巧,而不是解决UI线程同步问题。 只需在
\u RunWorkerCompleted
中将进度条设置为100%

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  progressBar1.Value = 100;
  Application.DoEvents();
  ExecuteButton.Enabled = false;
}

可悲的是,这并没有奏效。设置progressBar1.Value=100仍然需要运行动画。更新Value属性只需要几个周期,还不足以让它达到100%。是的,@IvanStoev,你是对的。谢谢你在正确的方向上帮助我。