Я, очевидно, не знаю, что я делаю, когда речь идет о параллельном программировании с .NET 4.0. У меня есть простое приложение для Windows, которое запускает задачу для выполнения бессмысленной работы (вывод чисел 1-1000). Я поставил существенную паузу на полпути, чтобы имитировать длительный процесс. Хотя эта длительная пауза происходит, если я нажму кнопку Stop, ее обработчик событий вызывает метод отмены CancellationTokenSource. Я не хочу делать дальнейшую обработку (в этом случае вывод сообщения) в обработчике событий кнопки Stop, пока отмененная задача не будет выполнена с ее текущей итерацией. Как мне это сделать? Я попытался использовать Task.WaitAll и т.д. В обработчике событий кнопки Stop, но это просто выбрасывает необработанное исключение 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();
}
Любая помощь с этим будет очень признательна. Спасибо заранее.