title: How to execute task in the wpf background while able to provide report and allow cancellation?
body: <p>I want to execute a long running task after clicking a wpf button. Here what I did.</p>
  
  <pre><code>private void Start(object sender, RoutedEventArgs e)
  {
      for (int i = 0; i &lt; 10; i++)
      {
          Thread.Sleep(2000); // simulate task
      }
  }
  </code></pre>
  
  <p>Problem is, this will make wpf gui unresponsive. I also would like to allow cancellation and report progress every 1 second. I expand the code as below.</p>
  
  <pre><code>    DispatcherTimer dispatcherTimer = new DispatcherTimer(); // get progress every second
      private int progress = 0; // for progress reporting
      private bool isCancelled = false; // cancellation
  
      private void Start(object sender, RoutedEventArgs e)
      {
          InitializeTimer(); // initiallize interval timer 
          Start(10); // execute task
      }
  
      private void InitializeTimer()
      {
          dispatcherTimer.Tick += dispatcherTimer_Tick;
          dispatcherTimer.Interval = new TimeSpan(0,0,1);
          dispatcherTimer.Start();
      }
  
      private void dispatcherTimer_Tick(object sender, EventArgs e)
      {
          Logger.Info("Current loop progress " + progress); // report progress
      }
  
      private void Cancel(object sender, RoutedEventArgs e) // cancel button
      {
          isCancelled = true;
      }
  
      private int Start(int limit)
      {
          isCancelled = true;
          progress = 0;
  
          for (int i = 0; i &lt; limit; i++)
          {
              Thread.Sleep(2000); // simulate task
              progress = i; // for progress report
              if (isCancelled) // cancellation
              {
                  break;
              }
          }
          return limit;
      }
  </code></pre>
  
  <p>My target platform is .NET 4.5. What is the recommended way to do this?</p>
  
  <p>Thanks.</p>