顺序等待 VS 继续等待

15

我想知道编写由两个或更多异步且相关的操作组成的异步代码的最佳/正确方法(第一个必须完成才能执行第二个)。

使用 async/await 的示例:

await RunFirstOperationAsync();
await RunSecondOperationAsync();

带有续行的示例:

await RunFirstOperationAsync()
    .ContinueWith(t => RunSecondOperationAsync());

2
看看这个 Stack Overflow 的讨论:https://dev59.com/9Woy5IYBdhLWcg3wHaXt - Jeroen Heier
1个回答

19

如果可能的话,您应该使用 await

ContinueWith 存在一些问题。我在我的博客文章中简要描述了这个问题:为什么 ContinueWith 是危险的。这篇文章建立在我之前的博客文章上:为什么 StartNew 是危险的(它们有很多相同的问题)。

特别地:

  • ContinueWith 没有一个良好的默认的 TaskScheduler。默认任务调度程序是 TaskScheduler.Current(而不是 TaskScheduler.Default),如果需要在当前的 SynchronizationContext 上继续执行,则必须手动完成。
  • ContinueWith 的默认选项不是最理想的。对于异步代码,至少需要 DenyChildAttachExecuteSynchronously
  • ContinueWith 不理解异步续体,这通常需要额外的 Unwrap 调用来解决此限制。
  • ContinueWith 对其 CancellationToken 参数处理方式令人惊讶。更多信息请参见我这篇博客文章

这些论点都在我的关于任务续体的博客文章中总结。 await没有任何这些缺点。


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