如何使用 async/await 设置 TaskContinuationOptions

本文关键字:设置 TaskContinuationOptions await 何使用 async | 更新日期: 2023-09-27 18:36:38

我可以使用 async/await 拥有所有选项,如 OnlyOnRanToCompletion、OnlyOnCanceled、NotOnFaulted 等吗?我找不到有关如何获得与使用任务相同的结果的示例,例如:

Task.Factory.StartNew(foo).ContinueWith(bar, TaskContinuationOptions.NotOnRanToCompletion);

我不确定简单的条件或异常处理是否可以管理显式任务中可用的所有延续行为。

如何使用 async/await 设置 TaskContinuationOptions

我可以使用 async/await 拥有所有选项,如 OnlyOnRanToCompletion、OnlyOnCanceled、NotOnFaulted 等吗?

你不需要。

await 没有使用位标志和 lambda 延续的大量语法,而是支持非常自然的 try/catch 语法:

try
{
  await foo();
}
catch
{
  bar();
  throw;
}

我不确定简单的条件或异常处理是否可以管理显式任务中可用的所有延续行为。

它们自然地处理NoneNotOnCanceledNotOnFaultedNotOnRanToCompletionOnlyOnCanceledOnlyOnFaultedOnlyOnRanToCompletion。大多数其他标志仅对并行任务有意义,而对异步任务没有意义。例如,AttachedToParentHideSchedulerPreferFairnessasync世界中没有意义; DenyChildAttachLazyCancellationExecuteSynchronously始终async世界中指定;LongRunning永远不应该。

我不这么认为。

Async/await 不是为了取代 TPL,而是通过使简单的操作更简洁来补充它。
如果仍然需要额外的配置,则必须坚持执行任务,或者可以尝试使用此行为实现自定义等待程序。