Wie zu Warten, für Abgebrochene Aufgabe zu Beenden?

Ich natürlich nicht weiß, was ich Tue, wenn es um die parallele Programmierung mit .NET 4.0. Ich habe eine einfache Windows-Anwendung, die eine Aufgabe startet, um einige der sinnlosen Arbeit (die Ausgabe von zahlen 1-1000). Ich habe eine beträchtliche pause in der Hälfte Weg durch simulieren eines lang andauernden Prozesses. Während dieser langen pause stattfindet, wenn ich drücken Sie die Stop-Taste, wird die zugehörige event-handler ruft die Cancel-Methode des CancellationTokenSource. Ich will nicht zu tun, jede weitere Verarbeitung (in diesem Fall die Ausgabe einer Nachricht) in der Haltestellen-button-event-handler, bis der abgebrochene Aufgabe wird erledigt, mit der aktuellen iteration. Wie mache ich das? Ich habe versucht, mit Aufgabe.WaitAll, etc in der Stop-button-event-handler, aber nur wirft eine unbehandelte AggregateException. Hier ist der code, die helfen, zu erklären, mein problem, wenn ausgeführt, wie oben beschrieben:

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

Jede Hilfe bei diesem würde sehr geschätzt werden. Vielen Dank im Voraus.

InformationsquelleAutor Mac | 2012-08-17
Schreibe einen Kommentar