当谈到使用 .NET 4.0 进行并行编程时,我显然不知道自己在做什么。我有一个简单的 Windows 应用程序,它启动一个任务来做一些无意识的工作(输出数字 1-1000)。我在中途暂停以模拟长时间运行的过程。当这个长时间的停顿发生时,如果我点击 Stop 按钮,它的事件处理程序会调用 CancellationTokenSource 的 Cancel 方法。我不想在停止按钮的事件处理程序中做任何进一步的处理(在这种情况下,输出一条消息),直到取消的任务通过其当前迭代完成。我该怎么做呢?我尝试在停止按钮的事件处理程序中使用 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();
}
对此的任何帮助将不胜感激。提前致谢。