Как ждать завершения отмененной задачи?

Я, очевидно, не знаю, что я делаю, когда дело доходит до параллельного программирования с .NET 4.0. У меня есть простое приложение для Windows, которое запускает задачу для выполнения бессмысленной работы (вывод числа 1-1000). Я поставил существенную паузу на полпути, чтобы смоделировать длительный процесс. Во время этой длинной паузы, если я нажимаю кнопку «Стоп», ее обработчик событий вызывает метод Cancel для CancellationTokenSource. Я не хочу выполнять какую-либо дальнейшую обработку (в данном случае вывод сообщения) в обработчике события кнопки «Стоп» до тех пор, пока отмененная задача не будет выполнена с ее текущей итерацией. Как мне это сделать? Я попытался использовать Task.WaitAll и т. Д. В обработчике события кнопки «Стоп», но это просто вызывает необработанное исключение AggregateException. Вот код, который поможет объяснить мою проблему, если он будет работать, как описано выше:

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

Любая помощь с этим будет принята с благодарностью. Заранее спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос