Task.Factory.ContinueWhenAll with async continuationAction



将多个异步任务链接在一起的正确方法是什么?我想知道所有的任务都成功了,或者有一个任务失败了,我的"管道"失败的

Task task1 = RunTask1();
Task task2 = RunTask2();
Task task3_isDependentOnTasks1And2 = Task.Factory.ContinueWhenAll(
new[] {task1,task2},
async tasks => await RunTask3());

根据我调试代码的经验,RunTask3永远不会被等待。

另一方面

Task task1 = RunTask1();
Task task2 = RunTask2();
Task task3_isDependentOnTasks1And2 = Task.Factory.ContinueWhenAll(
new[] {task1,task2},
tasks => RunTask3().GetAwaiter().GetResult());

似乎工作正常。

第二个片段是正确的模式吗?

有没有更好的模式来实现我的目标?

是否有更好的模式来实现我的目标?

是的。ContinueWhenAllContinueWith相似;它是一个低级的构建块,我不建议使用它。使用WhenAll代替:

Task task1 = RunTask1();
Task task2 = RunTask2();
await Task.WhenAll(task1, task2);
await RunTask3();

如果您需要这个任务,而不是在代码的这一点上使用await,那么使用本地async方法就可以了:

Task task1 = RunTask1();
Task task2 = RunTask2();
Task task3_isDependentOnTasks1And2 = Run3When1And2AreDoneAsync();
async Task Run3When1And2AreDoneAsync()
{
await Task.WhenAll(task1, task2);
await RunTask3();
}

最新更新