Basit
Basit

Reputation: 41

Progress bar not being updated in a separate form using BackgroundWorker C# WinForms

I was accessing DB in button click event in Main UI

private void button_Click(object sender, EventArgs e)
{ 
    SqlConnection con = new SqlConnection(ConString);

    // sample query
    string strSQL_Query = "SELECT COUNT(EmployeeID) FROM Employees";
    SqlCommand cmd_QueryLength = new SqlCommand(strSQL_Query, con);
    DataTable dt_Query = new DataTable();

    if (con.State == ConnectionState.Closed)
        con.Open();

    dt_Query.Load(cmd_QueryLength.ExecuteReader());
    con.Close();

    // Do some work
}

Now I want to show progress bar while data is fetched from DB so I placed DB access code in

private void backgroundWorker_start_DoWork(object sender, DoWorkEventArgs e)
{
    SqlConnection con = new SqlConnection(ConString);

    // sample query
    string strSQL_Query = "SELECT COUNT(EmployeeID) FROM Employees";
    SqlCommand cmd_QueryLength = new SqlCommand(strSQL_Query, con);
    DataTable dt_Query = new DataTable();

    if (con.State == ConnectionState.Closed)
        con.Open();

    dt_Query.Load(cmd_QueryLength.ExecuteReader());
    con.Close();

    // Do some work
    for (int i = 0; i < 20; i++)
        backgroundWorker_start.ReportProgress(i);

    // Do some more work
    for (int i = 0; i < 20; i++)
        backgroundWorker_start.ReportProgress(i);
}

And I updated my click event as following.

public MainForm()
{
    InitializeComponent();
    progressBarStart = new ProgressBar();
    backgroundWorker_start = new BackgroundWorker();
    backgroundWorker_start.WorkerReportsProgress = true;
}

private void button_Click(object sender, EventArgs e)
{
    backgroundWorker_start.DoWork += new DoWorkEventHandler(backgroundWorker_start_DoWork);
    backgroundWorker_start.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_start_ProgressChanged);
    backgroundWorker_start.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_start_RunWorkerCompleted);
    backgroundWorker_start.RunWorkerAsync();
}

private void backgroundWorker_start_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBarStart.Dispose();
}

void backgroundWorker_start_ProgressChanged(object sender, ProgressChangedEventArgs e)
{        
    progressBarStart.Value = e.ProgressPercentage;
} 

[UPDATE] My code is getting in to backgroundWorker_start_DoWork and completing my task however I can not see any progress in progress bar. Do I need to update ProgressBar UI or is there something else I need to see.

Progress Bar UI Form contains a progress bar

public partial class ProgressBar: Form
{
    public ProgressBar()
    { 
        InitializeComponent();        
    }
}

Upvotes: 1

Views: 472

Answers (1)

Sinatr
Sinatr

Reputation: 21999

When button is clicked you create BackgroundWorker, properly initialize it and start. Put breakpoint inside backgroundWorker_start_DoWork to see it.

What you did wrong is what

// Do some work
for (int i = 0; i < 20; i++)
    backgroundWorker_start.ReportProgress(i);

doesn't actually do anything and BackgroundWorker finishes immediately.

What you have to do: split your work into peaces, and report progress after each peace is completed. Try

// Do some work
for (int i = 0; i < 20; i++)
{
    System.Threading.Thread.Sleep(200);
    backgroundWorker_start.ReportProgress(i);
}

to actually see something happening.

Upvotes: 1

Related Questions