5

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

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

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

4

2 回答 2

12

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

你不需要。

代替使用位标志和 lambda 延续的丰富语法,await支持非常自然的try/catch语法:

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

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

他们自然地处理None, NotOnCanceled, NotOnFaulted, NotOnRanToCompletion, OnlyOnCanceled, OnlyOnFaulted, 和OnlyOnRanToCompletion. 大多数其他标志只对并行任务有意义,而不是异步任务。例如, AttachedToParent, HideScheduler, and PreferFairnessdon't make sense in the asyncworld; DenyChildAttach, LazyCancellation, 并且ExecuteSynchronously应该始终async世界中指定;永远LongRunning 应该。

于 2013-10-22T21:40:40.883 回答
0

我不这么认为。

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

于 2013-10-22T21:40:27.687 回答