amateur programmer
amateur programmer

Reputation: 331

Background Worker is called twice

I have a problem with background worker, it gets called twice thus, increasing the time of execution for my long routine, I created background worker manually so, there is no chance for the DoWork to be initialized within the initializeComponent() method, any help is appreciated.

here is my code:

// constructor


           public TeacherScheduleForm(Therapist therapist)
            {
                this.therapist = therapist;

                InitializeComponent();

                bw = new BackgroundWorker();
                bw.WorkerSupportsCancellation = true;
                bw.WorkerReportsProgress = true;
                bw.DoWork += bw_DoWork;
                bw.ProgressChanged += bw_ProgressChanged;
                bw.RunWorkerCompleted += bw_RunWorkerCompleted;
                load = new LoadingForm();
    }
 private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            load.AppendProgress(e.ProgressPercentage);
           // load.AppendText(e.ProgressPercentage.ToString() + "%");
            Console.Write("Progress: " + e.ProgressPercentage);
           // MessageBox.Show("Progress : " + e.ProgressPercentage);

        }

        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                MessageBox.Show("Cancelled");

            }

            else if (!(e.Error == null))
            {
                MessageBox.Show("Error : " + e.Error);

            }

            else
            {
                updateUI();
                load.Close();
                Console.Write( "Done!");
            }
        }


        // do work of background worker
        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; (i <= 2); i++)
            {
                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    Console.Write("Before Doing work");

                    setup(therapist.therapistID + "", schoolYear);// the time consuming operation
                    Console.Write("Doing work");
                    //System.Threading.Thread.Sleep(100);
                    worker.ReportProgress((i*5));
                }
            }
        }

The background worker is called when the user selects the school year through a combo box which is in this code below:

 private void comboBoxSchoolYear_SelectedIndexChanged(object sender, EventArgs e)
    {
        //load = new LoadingForm();
        schoolYear = int.Parse(comboBoxSchoolYear.SelectedValue + "");
        try{
            if (!bw.IsBusy)
            {
                bw.RunWorkerAsync();
                load.ShowDialog();
            }
            else
            {
                bw.CancelAsync();
            }
        }
        catch(Exception ex)
        {
            Console.Write("Error : " + ex.Message);
        }
    }

Upvotes: 1

Views: 903

Answers (1)

C4d
C4d

Reputation: 3282

You are loading the form after creating the event-handler. Thats the only point I can think off doing the trouble. Try to load the form first and then create the handler.

Reason: At InitializeComponent(); the IndexChanged normally will fire up because the control is set at this point with its index. I havnt noticed this behaviour on FormLoad till now. But as I cant see any other problem in here its worth a try.

IF this doesnt solves it, you should also take care if TeacherScheduleForm is being called twice.


Something handy for debugging-purposes:

MessageBox.Show((new StackTrace().GetFrame(0).GetMethod().Name));

Paste this into your event/method or whatever. It will popup a messagebox with the method-name which called your current method. In this case (from comments) it would've raised 2 messageBoxes saying TeacherScheduleForm for both.

I've saved this to my code-snippets.

Upvotes: 3

Related Questions