我如何等待Task.WhenAll( ... ).ContinueWith( AnotherAwaitable )?

9
我有以下的代码片段 -
await Task.WhenAll(TaskList /*List of Task objects*/);
await AnotherAwaitableMethod( );

这样做效果很好,也是必要的,因为AnotherAwaitableMethod依赖于确保在执行之前TaskList中的任务已经完成。

但是,我希望能够像这样表达:

await Task.WhenAll(TaskList).ContinueWith( /*AnotherAwaitableMethod call?*/ );

这种情况是否可行?我是否误解了Task.ContinueWith的目的?


1
你可以像这样做:await Task.WhenAll(TaskList).ContinueWith(_ => AnotherAwaitableMethod( )).Unwrap();。但是,如果第一个代码已经有效,为什么需要这样做呢? - user4003407
好的,问题中的关键词是“喜欢”,而不是“需要”,这是一种编码偏好;我希望调用在单行上。 - Will
@Will 你可以通过这样做将其放在同一行:await AnotherAwaitableMethod(await Task.WhenAll(TaskList)); - Asad Saeeduddin
为什么不使用 Task.WhenAll(Task.WhenAll(TaskList), AnotherAwaitableMethod()) - i3arnon
1个回答

16
  await Task.WhenAll(TaskList /*List of Task objects*/);
  await AnotherAwaitableMethod( );

 await Task.WhenAll(TaskList /*List of Task objects*/).ContinueWith(_ => {AnotherAwaitableMethod();}).Unwrap();

使用ContinueWith会产生几乎相同的作用。但是,如果你使用它的重载,就会获得更多的控制权。

使用ContinueWith的一个主要原因是,当你想要基于第一个任务的结果有条件地执行AnotherAwaitableMethod时,或者当你想要使用TaskContinuationOptions控制上下文时,可以使用它。


这就是我想要知道的;谢谢。 - Will
2
你可以很容易地使用await"基于第一个任务的结果"有条件地执行第二个任务,而使用ContinueWith实际上更难。此外,如果出现异常,则传递回调函数只会扭曲您的调用堆栈并使调试变得更加困难。像这样使用回调函数可以说是在第一时间就失去了异步/等待的意义。 - Asad Saeeduddin
1
这将返回 Task<Task>,因为 AnotherAwaitableMethod 返回一个 Task。你需要使用 Unwrap()。还有 TaskFactory.ContinueWhenAll。但是,Asad 是正确的,@Will,你不应该偏爱任何形式的 ContinueWith 而不是 await - noseratio - open to work

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接