Jak poczekać na zakończenie anulowanego zadania?

Oczywiście nie wiem, co robię, jeśli chodzi o programowanie równoległe z .NET 4.0. Mam prostą aplikację Windows, która uruchamia zadanie do wykonania bezmyślnej pracy (wyprowadzanie numerów 1-1000). W połowie drogi umieściłem znaczną przerwę, aby zasymulować długi proces. Podczas gdy ta długa pauza ma miejsce, jeśli kliknę przycisk Stop, jego obsługa zdarzeń wywoła metodę Cancel metody CancellationTokenSource. Nie chcę wykonywać żadnego dalszego przetwarzania (w tym przypadku wysyłania komunikatu) w procedurze obsługi przycisku przycisku Stop, dopóki anulowane zadanie nie zostanie wykonane z bieżącą iteracją. Jak mam to zrobic? Próbowałem użyć Task.WaitAll, etc w module obsługi zdarzenia przycisku Stop, ale to po prostu zgłasza nieobsługiwany wyjątek AggregateException. Oto kod, który pomoże wyjaśnić mój problem, jeśli zostanie uruchomiony w sposób opisany powyżej:

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

Każda pomoc zostanie doceniona. Z góry dziękuję.

questionAnswers(2)

yourAnswerToTheQuestion