将多个异步任务链接在一起的正确方法是什么?我想知道所有的任务都成功了,或者有一个任务失败了,我的"管道"失败的
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());
似乎工作正常。
第二个片段是正确的模式吗?
有没有更好的模式来实现我的目标?
是否有更好的模式来实现我的目标?
是的。ContinueWhenAll
与ContinueWith
相似;它是一个低级的构建块,我不建议使用它。使用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();
}