简体   繁体   中英

C# WinForm BackgroundWorker not Updating Processbar

I am having a little trouble with getting the backgroundworker to update my progress bar. I was using a tutorial online as an example, but my code is not working. I did some digging on this site and I can't find any kind of solution. I am new to the backgroundworker/progress thing. So I don't understand it fully.

Just to set things up: I have a main form (FORM 1) that opens another (FORM 3) with the progress bar and a status label.

my Form 3 code as is:

public string Message
{
    set { lblMessage.Text = value; }
}

public int ProgressValue
{
    set { progressBar1.Value = value; }
}
public Form3()
{
    InitializeComponent();
}

My Form 1 Partial Code:

private void btnImport_Click(object sender, EventArgs e)
{
    if (backgroundWorker1.IsBusy != true)
    {
        if (MessageBox.Show("Are you sure you want to import " + cbTableNames.SelectedValue.ToString().TrimEnd('$') + " into " + _db, "Confirm to Import", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            alert = new Form3(); //Created at beginning
            alert.Show();
            backgroundWorker1.RunWorkerAsync();
        }
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    int count = 0
    foreach(DataRow row in DatatableData.Rows)
    {
    /*... Do Stuff ... */
    count++;
    double formula = count / _totalRecords;
    int percent = Convert.ToInt32(Math.Floor(formula)) * 10;
    worker.ReportProgress(percent, string.Format("Completed record {0} out of " + _totalRecords, count));
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    alert.Message = (String) e.UserState;
    alert.ProgressValue = e.ProgressPercentage;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    alert.Close();
}

So. The problem is its not updating anything. The progress bar nor the label is updating. Can someone point me in the write direction or have a suggestion?

That will give you 0 * 10 because count and _totalRecords are integer values, and integer division is used here. Thus count is less than total records, you have formula equal to 0 :

double formula = count / _totalRecords; // equal to 0
int percent = Convert.ToInt32(Math.Floor(formula)) * 10; // equal to 0

Well, when all work is completed, you will have formula equal to 1 . But that's the reason why progress is not changing.

Here is correct percentage calculation:

int percent = count * 100 / _totalRecords;

You need to cast your INTEGER value to a DOUBLE, or C# Math will/could truncate it to 0:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
  var worker = (BackgroundWorker)sender;
  for (int count = 0; count < _totalRecords; count++) {
    /*... Do Stuff ... */
    double formula = 100 * ((double)count / _totalRecords); // << NOTICE THIS CAST!
    int percent = Convert.ToInt32(formula);
    worker.ReportProgress(percent, string.Format("Completed record {0} out of " + _totalRecords, count));
  }
}

You only report progress JUST before the work completes

worker.ReportProgress(percent, string.Format("Completed record {0} out of " + _totalRecords, count));

// You exit DoWork right after reporting progress

Try reporting progress periodically while the BackgroundWorker is running. Also check Jon's comment to ensure WorkerReportsProgress is set to true.

So i did more digging the properties that tells the object which tell the object which functions to go to weren't set :/

thanks for your help

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM