我想知道编写由两个或更多异步且相关的操作组成的异步代码的最佳/正确方法(第一个必须完成才能执行第二个)。
使用 async/await 的示例:
await RunFirstOperationAsync();
await RunSecondOperationAsync();
带有续行的示例:
await RunFirstOperationAsync()
.ContinueWith(t => RunSecondOperationAsync());
我想知道编写由两个或更多异步且相关的操作组成的异步代码的最佳/正确方法(第一个必须完成才能执行第二个)。
使用 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
没有任何这些缺点。