使用async/await可以获得像OnlyOnRanToCompletion、OnlyOnCanceled、NotOnFaulted等所有选项吗?我找不到如何实现与使用Tasks相同结果的示例:
Task.Factory.StartNew(foo).ContinueWith(bar, TaskContinuationOptions.NotOnRanToCompletion);
我不确定简单的条件语句或异常处理是否能够管理显式任务中所有可用的继续行为。
使用async/await可以获得像OnlyOnRanToCompletion、OnlyOnCanceled、NotOnFaulted等所有选项吗?我找不到如何实现与使用Tasks相同结果的示例:
Task.Factory.StartNew(foo).ContinueWith(bar, TaskContinuationOptions.NotOnRanToCompletion);
我不确定简单的条件语句或异常处理是否能够管理显式任务中所有可用的继续行为。
我能否使用async/await获得像OnlyOnRanToCompletion、OnlyOnCanceled、NotOnFaulted等所有选项?
你不需要这样做。
与使用位标志和lambda延续的繁琐语法不同,await
支持非常自然的try
/catch
语法:
try
{
await foo();
}
catch
{
bar();
throw;
}
我不确定简单的条件语句或异常处理是否能够处理显式任务中所有可用的继续行为。
它们自然地处理None
、NotOnCanceled
、NotOnFaulted
、NotOnRanToCompletion
、OnlyOnCanceled
、OnlyOnFaulted
和OnlyOnRanToCompletion
。大多数其他标志仅对并行任务有意义,而不是异步任务。例如,AttachedToParent
、HideScheduler
和PreferFairness
在async
世界中没有意义;DenyChildAttach
、LazyCancellation
和ExecuteSynchronously
应始终在async
世界中指定;而LongRunning
从不应该。
HideScheduler
并不是你想象中的那样(除非你正在实际执行任务调度器上的任务,否则它什么也不做)。有更好的选择。选项1)使您的UI异步。选项2)使用 Task.Run
创建任务。选项3)使用 ConfigureAwait(false)
避免死锁。 - Stephen ClearyConfigureAwait()
值得一试,我是通过阅读stackoverflow.com/a/15022170和Await, and UI, and deadlocks! Oh my!这两篇文章发现的。+1 - robert4我不这么认为。
Async/await并不是完全取代TPL,而是通过使简单操作更加清晰来补充它。
如果您仍然需要额外的配置,您将不得不坚持使用任务,或者尝试实现具有此行为的自定义awaiter。
try/catch
块,您就可以像在任何其他代码中一样编写代码。为什么你会想要使用那种风格呢?如果你想使用除了 "OnlyOn*" 或 "NotOn*" 选项之外的东西,你需要什么以及为什么? - Servyawait
所做的事情,但并不是所有可以通过显式任务完成的操作都可以使用await
完成。 - Servy