title: C# cancelling DoWork of background worker
body: <p>C# 2008</p>
  
  <p>I am using the code below to login to a softphone. However, the login progess is a long process as there are many things that have to be initialized and checks to be made, I have only put a few on here, as it would make the code to long to post.</p>
  
  <p>In the code below I am checking if the CancellationPending if the CancelAsync has been called in my cancel button click event, before doing each check. Is this correct? Also if the check fails I also call the CancelAsync and set the e.Cancel to true.</p>
  
  <p>I would like to know if my method I have used here is the best method to use.</p>
  
  <p>Many thanks for any advice,</p>
  
  <pre><code>private void bgwProcessLogin_DoWork(object sender, DoWorkEventArgs e)
      {   
          /*
           * Perform at test to see if the background worker has been
           * cancelled by the user before attemping to continue to login.
           * 
           * Cancel background worker on any failed attemp to login
           */
  
          // Start with cancel being false as to reset this if cancel has been set to true
          // in the cancel button.
          e.Cancel = false;
  
          NetworkingTest connection_test = new NetworkingTest();
          if (!this.bgwProcessLogin.CancellationPending)
          { 
              // Check local LAN or Wireless connection               
              if (!connection_test.IsNetworkConnected())
              {
                  // Update label
                  if (this.lblRegistering.InvokeRequired)
                  {
                      this.lblRegistering.Invoke(new UpdateRegisterLabelDelegate(UpdateRegisterLabel), "No network connection");
                  }
                  else
                  {
                      this.lblRegistering.Text = "No network connection";
                  }
                  // Failed attemp
                  this.bgwProcessLogin.CancelAsync();
                  e.Cancel = true;
                  return;
              }
              // Report current progress
              this.bgwProcessLogin.ReportProgress(0, "Network connected");
          }
          else
          {
              // User cancelled 
              e.Cancel = true;
              return;
          }
  
          // Test if access to Server is available
          if (!this.bgwProcessLogin.CancellationPending)
          {
              if (!connection_test.IsSIPServerAvailable())
              {
                  // Update label
                  if (this.lblRegistering.InvokeRequired)
                  {
                      this.lblRegistering.Invoke(new UpdateRegisterLabelDelegate(UpdateRegisterLabel), "Server unavailable");
                  }
                  else
                  {
                      this.lblRegistering.Text = "Server unavailable";
                  }
                  // Failed attemp
                  this.bgwProcessLogin.CancelAsync();
                  e.Cancel = true;
                  return;
              }
              // Report current progress
              this.bgwProcessLogin.ReportProgress(1, "Server available");
          }
          else
          {
              // User cancelled 
              e.Cancel = true;
              return;
          }
          .
          .
          .
  }
  
  
   private void bgwProcessLogin_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {   
          // Check for any errors
          if (e.Error == null)
          {
              if (e.Cancelled)
              {
                  // User cancelled login or login failed                
              }
              else
              {
                  // Login completed successfully                
              }
          }
          else
          {
              // Something failed display error
              this.statusDisplay1.CallStatus = e.Error.Message;
          }
      }
  
  
   private void bgwProcessLogin_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
          this.lblRegistering.Text = e.UserState.ToString();
      }
  
  private void btnCancel_Click(object sender, EventArgs e)
      {
          // Cancel the logging in process
          this.bgwProcessLogin.CancelAsync();
          this.lblRegistering.Text = "Logged out";
  }
  </code></pre>