Reputation: 41
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
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