Como esperar pela tarefa cancelada para concluir?

Eu obviamente não sei o que estou fazendo quando se trata de programação paralela com o .NET 4.0. Eu tenho um aplicativo simples do Windows que inicia uma tarefa para fazer algum trabalho insensato (saída de números 1-1000). Eu coloquei uma pausa substancial no meio para simular um processo de longa duração. Enquanto esta longa pausa está ocorrendo, se eu apertar o botão Stop, seu manipulador de eventos chama o método Cancel de CancellationTokenSource. Eu não quero fazer nenhum processamento adicional (neste caso, a saída de uma mensagem) no manipulador de eventos do botão Stop até que a tarefa cancelada seja concluída com sua iteração atual. Como eu faço isso? Eu tentei usar Task.WaitAll, etc no manipulador de eventos do botão Stop, mas isso apenas lança um AggregateException não manipulado. Aqui está o código que ajudará a explicar meu problema se for executado conforme descrito acima:

  private Task t;
  private CancellationTokenSource cts;

  public Form1()
  {
     InitializeComponent();
  }

  private void startButton_Click(object sender, EventArgs e)
  {
     statusTextBox.Text = "Output started.";

     // Create the cancellation token source.
     cts = new CancellationTokenSource();

     // Create the cancellation token.
     CancellationToken ct = cts.Token;

     // Create & start worker task.
     t = Task.Factory.StartNew(() => DoWork(ct), ct);
  }

  private void DoWork(CancellationToken ct)
  {
     for (int i = 1; i <= 1000; i++)
     {
        ct.ThrowIfCancellationRequested();

        Thread.Sleep(10);  // Slow down for text box outout.
        outputTextBox.Invoke((Action)(() => outputTextBox.Text = i + Environment.NewLine));

        if (i == 500)
        {
           Thread.Sleep(5000);
        }
     }
  }

  private void stopButton_Click(object sender, EventArgs e)
  {
     cts.Cancel();

     Task.WaitAll(t);  // this doesn't work :-(

     statusTextBox.Text = "Output ended.";
  }

  private void exitButton_Click(object sender, EventArgs e)
  {
     this.Close();
  }

Qualquer ajuda com isso seria muito apreciado. Desde já, obrigado.

questionAnswers(2)

yourAnswerToTheQuestion