title: Winforms Updating UI Asynchronously Pattern - Need to Generalize
body: <p>Setup: Main MDI form with a progress bar and a label. </p>
  
  <p><strong>Code in Main form.</strong></p>
  
  <pre><code>    public delegate void UpdateMainProgressDelegate(string message, bool isProgressBarStopped);
  
              private void UpdateMainProgress(string message, bool isProgressBarStopped)
              {
                  // make sure we are running on the right thread to be
                  // updating this form's controls.
                  if (InvokeRequired == false)
                  {
                      // we are running on the right thread.  Have your way with me!
                      bsStatusMessage.Caption = message + " [ " + System.DateTime.Now.ToShortTimeString() + " ]";
                      progressBarStatus.Stopped = isProgressBarStopped;
                  }
                  else
                  {
                      // we are running on the wrong thread.  
                      // Transfer control to the correct thread!                
                      Invoke(new ApplicationLevelValues.UpdateMainProgressDelegate(UpdateMainProgress), message, isProgressBarStopped);
                  }
              }
  </code></pre>
  
  <p><strong>Child Form</strong></p>
  
  <pre><code>private readonly ApplicationLevelValues.UpdateMainProgressDelegate _UpdateMainForm;
  private void btnX_Click(object sender, EventArgs e)
          {
              _UpdateMainForm.BeginInvoke("StartA", false, null, null);
              try
              {
                  if(UpdateOperationA())
                  { _UpdateMainForm.BeginInvoke("CompletedA", true, null, null); }
                  else
                  { _UpdateMainForm.BeginInvoke("CanceledA", true, null, null); }
              }
              catch (System.Exception ex)
              {
                  _UpdateMainForm.BeginInvoke("ErrorA", true, null, null);
                  throw ex;
              }
          }
  </code></pre>
  
  <p>Its working pretty fine, but for N buttons or N operations I have to write the same code again and again. Is there any way this can be generalized or any other better way to update the UI.</p>