我试图围绕 C# 中并行任务的一些语法和结构,特别是链接多个任务和处理错误。
我要创建的具体步骤顺序是:
- 生成一个并行任务并立即返回 UI。
- 在并行任务中:
- 做
Process1()
- 如果
Process1()
完成没有错误,请执行Process2()
- 如果
Process2()
完成没有错误,请执行Process3()
- 如果所有任务都完成且没有错误,请执行
SuccessCondition()
- 如果任何任务导致错误,请执行
ErrorCondition()
- 做
我的理解是,我将创建一个Task
并调用ContinueWith()
以链接更多任务,传入一个TaskContinuationOptions
标志以确定何时执行该继续。此外,成功/错误条件将贯穿所有延续到最后。所以我目前正在尝试这个:
var task = new Task(() => Process1());
var task2 = task.ContinueWith(t => Process2(), TaskContinuationOptions.OnlyOnRanToCompletion);
var task3 = task2.ContinueWith(t => Process3(), TaskContinuationOptions.OnlyOnRanToCompletion);
var task4 = task3.ContinueWith(t => SuccessCondition(t), TaskContinuationOptions.OnlyOnRanToCompletion);
var task5 = task4.ContinueWith(t => ErrorCondition(t), TaskContinuationOptions.NotOnRanToCompletion);
task.Start();
ErrorCondition()
它的行为似乎符合预期,除了t
在Process2()
. 查看处理异常的 MSDN 文章,它说要这样做:
try
{
task.Wait();
}
catch (AggregateException ex)
{
// Handle exceptions from a collection on ex
}
但是,我试过了,它似乎也没有例外。另外,通过这样调用.Wait()
主线程,我是否否定了并行性并只是阻塞了?在我的测试中看起来就是这样。
所以我想我的问题是......链接相关任务并在这里处理整体成功/错误条件的正确方法是什么?或者,应该如何正确捕获从这些任务中抛出的异常,同时仍立即返回 UI?