¿Cómo esperar a que termine la tarea cancelada?

Obviamente, no sé lo que estoy haciendo cuando se trata de programación paralela con .NET 4.0. Tengo una aplicación de Windows simple que inicia una tarea para realizar un trabajo sin sentido (números de salida 1-1000). Puse una pausa sustancial a mitad de camino para simular un proceso de larga ejecución. Mientras se lleva a cabo esta larga pausa, si presiono el botón Detener, su controlador de eventos llama al método Cancelar de Cancelación de origen. No quiero seguir procesando (en este caso, emitir un mensaje) en el controlador de eventos del botón Detener hasta que la tarea cancelada termine con su iteración actual. ¿Cómo hago esto? Intenté usar Task.WaitAll, etc. en el controlador de eventos del botón Detener, pero eso solo produce una excepción AggregateException no controlada. Aquí está el código que ayudará a explicar mi problema si se ejecuta como se describe anteriormente:

  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();
  }

Cualquier ayuda con esto sería muy apreciada. Gracias por adelantado.