繁体   English   中英

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

[英]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() + "%");
    }

有关其他信息可以使用链接

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

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

总之:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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