Как ждать завершения отмененной задачи?
Я, очевидно, не знаю, что я делаю, когда дело доходит до параллельного программирования с .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();
}
Любая помощь с этим будет принята с благодарностью. Заранее спасибо.