Search code examples
c#.netwinformsprogress-barbackgroundworker

Why my backgroundworker do not work for progress bar


Why my background worker does not work for progress bar (By default set visibility to false .).

I am trying to have a progress bar in the background. when the user clicks OK button then I start the timer and make the progress bar visible. and run backgroundWorker.RunWorkerAsync(); and in backgroundWorker_RunWorkerCompleted i set visibility of progress bar to false.

The problem is it just shows the progressbar but do not show the progress.

My code is here :

        private void btnOk_Click(object sender, EventArgs e)
        {
            timer.Start();
            progressBar.Visible = true;
            backgroundWorker.RunWorkerAsync();
           doSomeWork();
        }

 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            timer.Stop();
            progressBar.Visible = false;   
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("called");
            if (progressBar.Value == progressBar.Maximum)
            {
                progressBar.Value = progressBar.Minimum;
                return;
            }
            progressBar.PerformStep();
        }

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

Why does it not show progress in the progress bar ? Does whats wrong in it ?


Solution

  • Your backgroundWorker_DoWork is not doing anything. Move doSomeWork in DoWork event. And you need to set ReportProgress to true.

    private void btnOk_Click(object sender, EventArgs e)
    {
        timer.Start();
        progressBar.Visible = true;
        backgroundWorker.ReportsProgress = true;
        backgroundWorker.RunWorkerAsync();
    }
    
    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        doSomeWork();
    }
    
    private void doSomeWork()
    {
      //do what you want here..
      backgroundWorker.ReportProgress(yourprogresspercentagenumber);
      //do what you want again..
      backgroundWorker.ReportProgress(yourprogresspercentagenumber);
    }