进度条在后台工作人员中无法正常工作

Progress Bar not working properly in background worker

我需要有一个进度条来工作(可见),在一个进程之后,可见性应该设置为 false。我正在为此过程使用后台工作人员。但是在使用可见性 属性 时,应用程序会停止运行,否则应用程序会 运行 正常。我正在使用 Devexpress 进度条。请帮助我。这是我正在工作的代码。

private void Generate_Click(object sender, EventArgs e)
    {
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.RunWorkerAsync();
    }
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int a = 0;
        int b = 0;
        ProgressBar.Visible = true;
        ProgressBar.Properties.Step = 1;
        ProgressBar.Properties.PercentView = true;
        ProgressBar.Properties.Maximum = SpecInformations.TotalSPCOCount;
        ProgressBar.Properties.Minimum = 0;
        Method_Call(a,b, sender as BackgroundWorker);
    }

    private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ProgressBar.PerformStep();
        ProgressBar.Update();
    }

    private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        ProgressBar.Visible = false;
    }

代码可以帮助您在 BackgroundWorker 中使用进度条:

private void cmdButton_Click(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerAsync();
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 0; i < 101; i++)
        {
            worker.ReportProgress(i);
            System.Threading.Thread.Sleep(1000);
        }
    }

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lblProgress.Text = ("Progress: " + e.ProgressPercentage.ToString() + "%");
    }

更多信息可以使用 link

您无法从 DoWork 方法或它调用的任何方法内部访问 Windows ProgressBar 等控件,因为 运行 此代码的线程是后台线程,而不是创建的线程控制。如果您尝试,您将得到一个异常,其消息表明该控件正被创建它的线程以外的线程访问。这是关于windows控件的不可侵犯的规则;它们必须始终只能由创建它们的线程访问

BackgroundWorker 有一个必须设置为 true 的 WorkerReportsProgress 属性 和一个可以用 int 调用的 ReportProgress() 方法(并传递一个可选对象以获取更多信息) 的完成百分比。当您在 DoWork 中调用此方法时,BackgroundWorker 将自动引发 ProgressChanged 事件,并且关键的是,它使用创建它的前台线程(创建其他控件的线程相同)执行此操作,因此您的 ProgressChanged 事件处理程序中的代码是运行 使用正确的线程并且可以在不引起异常的情况下访问 ProgressBar 控件

总结:

  • 将 WorkerReportsProgress 设置为 true
  • 在 DoWork 中调用 ReportProgress,传递完成百分比或使用 int 指示进程已达到某个阶段(不一定是百分比)
  • 将事件处理程序附加到工作人员的 ProgressChanged 事件
  • 将您的 ProgressBar 代码移至 ProgressChanged 事件处理程序