Wie warte ich, bis die abgebrochene Aufgabe abgeschlossen ist?
Ich weiß natürlich nicht, was ich bei der Parallelprogrammierung mit .NET 4.0 mache. Ich besitze eine einfache Windows-App, mit der eine Aufgabe gestartet wird, mit der Sie unnötige Aufgaben erledigen können (Ausgabe der Nummern 1-1000). Auf halbem Weg habe ich eine Pause eingelegt, um einen lang andauernden Prozess zu simulieren. Während diese lange Pause stattfindet, ruft die Ereignisbehandlungsroutine die Cancel-Methode von CancellationTokenSource auf, wenn ich die Stop-Taste drücke. Ich möchte keine weitere Verarbeitung (in diesem Fall das Ausgeben einer Nachricht) in der Ereignisbehandlungsroutine der Schaltfläche "Stopp" vornehmen, bis die abgebrochene Aufgabe mit der aktuellen Iteration abgeschlossen ist. Wie mache ich das? Ich habe versucht, Task.WaitAll usw. in der Ereignisbehandlungsroutine der Schaltfläche Stopp zu verwenden, aber dadurch wird nur eine nicht behandelte AggregateException ausgelöst. Hier ist der Code, der mein Problem erklärt, wenn er wie oben beschrieben ausgeführt wird:
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 dabei wäre sehr dankbar. Danke im Voraus.