顺序等待VS继续等待

我想知道编写异步代码的最佳/正确方法是什么,该异步代码由两个(或更多)异步和依赖(第一个必须完成执行第二个)操作组成。

使用async / await的示例:

await RunFirstOperationAsync(); await RunSecondOperationAsync(); 

续例示例:

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

如果可能的话,你想要await

ContinueWith有很多问题。 我在我的博客文章中简要描述了为什么ContinueWith是危险的 ,它建立在我早期的博客文章中, 为什么StartNew是危险的 (他们有许多相同的问题)。

特别是:

  • ContinueWith没有一个好的默认TaskScheduler 。 默认任务调度程序是TaskScheduler.Current (不是TaskScheduler.Default ),如果需要,必须手动完成当前SynchronizationContext上的恢复。
  • ContinueWith具有非理想的默认选项 。 对于异步代码,至少需要DenyChildAttachExecuteSynchronously
  • ContinueWith不了解异步延续,这通常需要额外的Unwrap调用来解决此限制。
  • ContinueWith以令人惊讶的方式处理其CancellationToken参数。 更多关于我的博客文章 。

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