2015-08-10 2 views
1

У меня проблема с фоновым работником, он дважды вызывает вызов, увеличивая время выполнения для моей длительной рутины, я создал фона рабочего вручную, поэтому нет возможности инициализировать DoWork внутри метод initializeComponent(), любая помощь оценивается.Фоновый работник вызывается дважды

вот мой код:

// 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)); 
       } 
      } 
     } 

Фоновый рабочий вызывается, когда пользователь выбирает учебный год через поле со списком, который находится в этом ниже код:

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); 
     } 
    } 
+5

Этот вопрос проще решить самостоятельно. Задайте точку останова для вашего bg-worker и начните отладку. Затем, если вы нажмете, наведите указатель мыши на свой «отправитель» и проверьте в появившемся окне, откуда пришел вызов. Это серьезно гораздо больше для других, которые просматривают ваш код. – C4u

+2

На самом деле, я бы поставил точку останова на строке «schoolYear = blahblahblah», чтобы увидеть *, когда вызывается * SelectedIndexChanged(). Но я согласен, что это ошибка, которую намного проще решить, используя точки останова. –

+0

@MikeGledhill благодарит много, как вы сказали, SelectIndexChanged был вызван дважды –

ответ

3

Вы погрузка после создания обработчика событий. Это единственный момент, который я могу придумать. Сначала попробуйте загрузить форму, а затем создайте обработчик.

Причина: В InitializeComponent();IndexChanged обычно срабатывает, потому что контроль установлен на данный момент с его индексом. Я до сих пор не заметил этого поведения в FormLoad. Но, поскольку я не вижу никакой другой проблемы здесь, стоит попробовать.

IF это не решает, вы также должны позаботиться о том, что вызов TeacherScheduleForm вызывается дважды.


Что-то удобно для отладки-целей:

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

Вставьте в событие/метод или любой другой. Появится всплывающее окно с именем метода, которое вызвало ваш текущий метод. В этом случае (из комментариев) он поднял бы 2 сообщенияBoxes, говорящих TeacherScheduleForm для обоих.

Я сохранил это в своих кодовых фрагментах.

+1

большое спасибо, я установил точку останова, и оказалось, что вы сказали, что indexchanged вызывается дважды! –

+1

Позвольте добавить дополнительный намек для вас на будущее. 1 мин. – C4u

+1

это очень удобно! большое спасибо :) –

Смежные вопросы