进度栏在后台工作程序中无法正常工作

问题描述 投票:0回答:2

我需要一个进度条才能在一个进程中工作(可见),之后应将可见性设置为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;
    }
c# .net devexpress progress-bar backgroundworker
2个回答
0
投票

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

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

摘要:

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

0
投票

该代码可以帮助您使用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

© www.soinside.com 2019 - 2024. All rights reserved.