Raggaer
Raggaer

Reputation: 3318

C# BackgroundWorker class

Currently im trying to update my progress bar if the background worker reports something, heres my code

Form1.cs

namespace YTD
{
    public partial class Form1 : Form
    {
        private Main app;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int n;
            bool isNumeric = int.TryParse(numberBox.Text, out n);

            if (!String.IsNullOrWhiteSpace(emailBox.Text) && !String.IsNullOrWhiteSpace(passBox.Text) && !String.IsNullOrWhiteSpace(numberBox.Text) && isNumeric)
            {
                this.app = new Main(emailBox.Text, passBox.Text, n, logBox, statusBar, backgroundWorker1);
                this.app.startMule();
            }
            else
            {
                MessageBox.Show("Please fill out all the form fields", "MuleMaker error");
            }
        }
    }
}

And my Main.cs

namespace YTD.classes
{
    public class Main
    {
        private String email;
        private String password;
        private int number;
        private RichTextBox logBox;
        private ProgressBar statusBar;
        private BackgroundWorker threadWorker;

        public Main(String email, String password, int number, RichTextBox logBox, ProgressBar statusBar, BackgroundWorker threadWorker)
        {
            // Define some variables

            this.email = email;
            this.password = password;
            this.number = number;
            this.logBox = logBox;
            this.statusBar = statusBar;
            this.threadWorker = threadWorker;
        }

        public void startMule()
        {
            // Set progressbar 100% value

            statusBar.Maximum = this.number;

            if (!threadWorker.IsBusy)
            {
                threadWorker.RunWorkerAsync();
            }
        }

        private void threadWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 1; i <= 10; i++)
            {
                // Perform a time consuming operation and report progress.
                MessageBox.Show("ye");
                System.Threading.Thread.Sleep(500);
                threadWorker.ReportProgress(i * 10);
            }
        }

        private void threadWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            statusBar.Increment(1);
        }
    }
}

Currently I get no errors but the progress bar value is not beeing changed. Without the background worker i can update my progress bar fine but not while doing an expensive action.

Upvotes: 0

Views: 596

Answers (1)

myst3rium
myst3rium

Reputation: 156

Your posted Code does not reveal, if you registered your functions to the BackgroundWorker Events.

Creating a new BackgrounWorker isn't enough. Here is an example:

public Class Main
{
    public Main( ... )
    {
        BackgroundWorker worker = new BackgroundWorker()
        worker.WorkerReportsProgress = true;

        // Register to BackgroundWorker-Events
        worker.DoWork += threadWorker_DoWork;
        worker.ProgressChanged += threadWorker_ProgressChanged;
    }
}

in addition you should tell your ProgressBar to rerender.

private void threadWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    statusBar.Increment(1);
    statusBar.Invalidate(true);
}

at least you might want to use the value you have set calling ReportProgress(i * 10).

private void threadWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    statusBar.Value = e.ProgressPercentage;
    statusBar.Invalidate(true);
}

Upvotes: 1

Related Questions