考虑以下示例:
var task = DoSomething()
bool ready = await DoSomethingElse();
if (!ready)
return null;
var value = await DoThirdThing(); // depends on DoSomethingElse
return value + await task;
DoSomething
做一些非常重要的工作,可能要花一些时间,因此我们首先开始。
同时,我们检查是否准备就绪,DoSomethingElse
如果没有,请提早退出。
我们DoThirdThing
只有在时才呼叫ready
,否则宇宙可能会爆炸。
我们不能使用Task.WhenAll
asDoThirdThing
依赖,DoSomethingElse
也不想等待,DoSomething
因为如果可能的话,我们想同时调用其他两个方法。
问题:发生什么task
,如果我们不能ready
和退出早?
它抛出的任何异常都会被抛出SynchronizationContext
吗?
如果task
正常完成,没有人会消耗其价值,是否会出现问题?
后续行动:有没有一种整洁的方法来确保task
等待?
await task
如果不是ready
,我们可以简单地进行选择,但是如果有50个退出条件,这将非常繁琐。
可以使用一个finally
块来await task
重新抛出潜在的异常吗?如果task
正常完成,则将再次等待finally
,但这不会引起任何问题?
问题:如果我们还没准备好并提早退出,任务将会怎样?
没有。该代码将忽略该任务,因此将忽略该任务。
它引发的任何异常会被SynchronizationContext重新抛出吗?
不。它们(最终)将被传递到TaskScheduler.UnobservedTaskException
然后被忽略。
如果没有人消耗其价值,任务正常完成是否会出现问题?
不。
后续行动:是否有一种整洁的方法来确保等待任务?
没有。
是否可以使用finally块来等待任务并重新抛出潜在的异常?
是的,如果您的代码实际上await
是任务。大概这意味着将任务保存在某个地方。
如果任务正常完成,将在finally块中再次等待它,但这应该不会引起任何问题?
您可以await
根据需要多次执行任务。
如果我们还没有准备好,我们可以简单地等待任务,但是如果有50个退出条件,这将非常繁琐。
然后考虑重组代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句