Big Pimpin
Big Pimpin

Reputation: 437

BackgroundWorker never does anything?

This is the code that I am trying to execute, but stepping through my code I never see any progress indicated or updated on my windows form showing progressbar1. This is my 1st attempt in getting a background worker to function properly, and all I have is a windows form with one button on it and this is all of the code involved in the project.

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    private int i = 0;

     public Form1()
    {
        InitializeComponent();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = false;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
    }

    private void button1_Click(object sender, EventArgs e)
    {
            backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        ReadySteadyGo();
        worker.ReportProgress((i * 10));
        FinalizeAndFinish();
        worker.ReportProgress((i * 10));
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar1.Text = "Done!";
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Text = (e.ProgressPercentage.ToString() + "%");
    }

    private void ReadySteadyGo()
    {
        Thread.Sleep(100000);
    }
    private void FinalizeAndFinish()
    {
        Thread.Sleep(1000);
    }
}

Upvotes: 0

Views: 290

Answers (2)

Bruno
Bruno

Reputation: 4665

I recreated your example in Visual Studio and am hitting a breakpoint in backgroundWorker1_DoWork so the multi-threading is working properly, you just need to do proper processing?

    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 100; i++)
        {
            backgroundWorker1.ReportProgress(i);
            Thread.Sleep(100);
        }
    }

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

Upvotes: 1

user700390
user700390

Reputation: 2339

It appears that you are using Thread.Sleep() to simulate a long-running operation. There are a few things you should consider based on your code example:

When the backgroundWorker1.RunWorkerAsync(); is executed, it starts working on another thread. Thus, if you are debugging interactively and you have not set a breakpoint in the backgroundWorker1_DoWork method, you are not likely to see this code execute.

When the Thread.Sleep(100000) executes, it essentially means that the background worker will pause for 100 seconds - so you need to make sure you are waiting at least that long to see the UI updated.

Also, as per Hans Passant's comment, consider the following:

Nor can you see it doing anything, there's no point to assigning the ProgressBar.Text property since it doesn't display text. Set Value instead.

Upvotes: 3

Related Questions