顺序等待VS继续等待
我想知道编写异步代码的最佳/正确方法是什么,该异步代码由两个(或更多)异步和依赖(第一个必须完成执行第二个)操作组成。
使用async / await的示例:
await RunFirstOperationAsync(); await RunSecondOperationAsync();
续例示例:
await RunFirstOperationAsync() .ContinueWith(t => RunSecondOperationAsync());
如果可能的话,你想要await
。
ContinueWith
有很多问题。 我在我的博客文章中简要描述了为什么ContinueWith
是危险的 ,它建立在我早期的博客文章中, 为什么StartNew
是危险的 (他们有许多相同的问题)。
特别是:
-
ContinueWith
没有一个好的默认TaskScheduler
。 默认任务调度程序是TaskScheduler.Current
(不是TaskScheduler.Default
),如果需要,必须手动完成当前SynchronizationContext
上的恢复。 -
ContinueWith
具有非理想的默认选项 。 对于异步代码,至少需要DenyChildAttach
和ExecuteSynchronously
。 -
ContinueWith
不了解异步延续,这通常需要额外的Unwrap
调用来解决此限制。 -
ContinueWith
以令人惊讶的方式处理其CancellationToken
参数。 更多关于我的博客文章 。
这些论点都在我关于任务延续的博客文章中进行了总结。 await
没有任何这些缺点。