title: How to reset the CancellationTokenSource and debug the multithread with VS2010?
body: <p>I have used CancellationTokenSource to provide a function so that the user can 
  cancel the lengthy action. However, after the user applies the first cancellation, 
  the later further action doesn't work anymore. My guess is that the status of CancellationTokenSource has been set to Cancel and I want to know how to reset 
  it back.</p>
  
  <ul>
  <li><p>Question 1: How to reset the CancellationTokenSource after the first time usage?</p></li>
  <li><p>Question 2: How to debug the multithread in VS2010?
  If I run the application in debug mode, I can see the following exception for 
  the statement</p>
  
  <pre><code>this.Text = string.Format("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId);
  </code></pre></li>
  </ul>
  
  <blockquote>
    <p>InvalidOperaationException was unhandled by user code
    Cross-thread operation not valid: Control 'MainForm' accessed from a thread other 
    than the thread it was created on.</p>
  </blockquote>
  
  <p>Thank you.</p>
  
  <pre><code>private CancellationTokenSource cancelToken = new CancellationTokenSource();
  
  private void button1_Click(object sender, EventArgs e)
  {
      Task.Factory.StartNew( () =&gt;
      {
          ProcessFilesThree();
      });
  }
  
  private void ProcessFilesThree()
  {
      ParallelOptions parOpts = new ParallelOptions();
      parOpts.CancellationToken = cancelToken.Token;
      parOpts.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
  
      string[] files = Directory.GetFiles(@"C:\temp\In", "*.jpg", SearchOption.AllDirectories);
      string newDir = @"C:\temp\Out\";
      Directory.CreateDirectory(newDir);
  
      try
      {
          Parallel.ForEach(files, parOpts, (currentFile) =&gt;
          {
              parOpts.CancellationToken.ThrowIfCancellationRequested();
  
              string filename = Path.GetFileName(currentFile);
  
              using (Bitmap bitmap = new Bitmap(currentFile))
              {
                  bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
                  bitmap.Save(Path.Combine(newDir, filename));
                  this.Text =  tring.Format("Processing {0} on thread {1}",  filename, Thread.CurrentThread.ManagedThreadId);
              }
          });
  
          this.Text = "All done!";
      }
      catch (OperationCanceledException ex)
      {
          this.Text = ex.Message;                             
      }
  }
  
  private void button2_Click(object sender, EventArgs e)
  {
      cancelToken.Cancel();
  }
  </code></pre>