title: Backgroundworker ReportProgress event does not fire
body: <p>I've a backgroundworker which take care of a timer in my application. This is the code:</p>
  
  <pre><code>    protected override void OnLoad(EventArgs e)
      {
          // Inizializzo il backgroundworker 
          bgwTimer.WorkerReportsProgress = true;
          bgwTimer.WorkerSupportsCancellation = true;
          bgwTimer.DoWork += (bgwTimer_DoWork);
          bgwTimer.RunWorkerCompleted +=(bgwTimer_RunWorkerCompleted);
          bgwTimer.ProgressChanged += (bgwTimer_ProgressChanged);
      }
  
      void bgwTimer_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
          throw new NotImplementedException();
      }
  
      void bgwTimer_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
          throw new NotImplementedException();
      }
  </code></pre>
  
  <p>Basically the event "ProgressChanged" is never fired and so I cannot update the status of a progressbar.
  The event DoWork is linked to this method:</p>
  
  <pre><code>    void bgwTimer_DoWork(object sender, DoWorkEventArgs e)
      {
          int i = 0;
          if (bgwTimer.CancellationPending)
          {
              e.Cancel = true;
          }
          else
          {
              while (bgwTimer.IsBusy)
              {                
                  Thread.Sleep(1000);
                  bgwTimer.ReportProgress(i);
                  refreshTimer();
              }
          }
      }
  </code></pre>
  
  <p>By my side the code looks good and it runs fine. As you can see the ReportProgress method is called but the event is not fired. Any hints?</p>
  
  <p>UPDATE:
  Whops! I found that the event "bgwTimer_ProgressChanged" is fired only if I run the RunWorkerAsync right after the declaration of event. Basically:</p>
  
  <p>bgwTimer.ProgressChanged += (bgwTimer_ProgressChanged);
  bgwTimer.RunWorkerAsync(); //this works!</p>
  
  <p>Since I run the worker when the user press a button, the event is not triggered.</p>
  
  <hr>
  
  <p>Here's the code of click event button:</p>
  
  <pre><code>    private void btnNext_Click(object sender, EventArgs e)
      {            
          this.TopMost = true;
          btnNext.Enabled = false;
          progressBar1.Step = 0;
  
          if (_bgwTimer.IsBusy)
              _bgwTimer.CancelAsync();
          else
              _bgwTimer.RunWorkerAsync();
      }
  </code></pre>