我正在使用新的async await特性,从C#的backgroundworker进行升级。在以下代码中,我试图使用ContinueWith方法复制多个任务的执行。
Task t1 = new Task
(
() =>
{
Thread.Sleep(10000);
// make the Task throw an exception
MessageBox.Show("This is T1");
}
);
Task t2 = t1.ContinueWith
(
(predecessorTask) =>
{
if (predecessorTask.Exception != null)
{
MessageBox.Show("Predecessor Exception within Continuation");
return;
}
Thread.Sleep(1000);
MessageBox.Show("This is Continuation");
},
TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.OnlyOnRanToCompletion
);
t1.Start();
try
{
t1.Wait(); <------ Comment
t2.Wait(); <------ Comment
}
catch (AggregateException ex)
{
MessageBox.Show(ex.InnerException.Message);
}
我的问题是当我注释掉 t1.wait 和 t2.wait 时,任务不会阻塞用户界面。然而,当我取消注释 t1.wait 和 t2.wait 时,用户界面会一直阻塞,直到线程执行完成。希望的行为是在 try/catch 块中捕获错误,而不会阻塞用户界面。我错过了什么?