考虑这个例子:
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
only如果我们是ready
,否则宇宙可能会爆炸。
我们不能使用Task.WhenAll
as DoThirdThing
依赖于取决于DoSomethingElse
我们也不想等待DoSomething
因为如果可能的话,我们希望同时调用其他两个方法。
问题:会发生什么task
如果我们不ready
并提前退出?
它抛出的任何异常都会被重新抛出吗?SynchronizationContext
?
是否有问题,如果task
正常完成,因为没有人消耗它的价值?
跟进:有没有一种巧妙的方法来确保task
正在等待?
我们可以简单地await task
如果我们不是ready
,但是如果有 50 个退出条件,这将非常乏味。
可以一个finally
块用于await task
并重新抛出潜在的异常?如果task
正常完成后,将再次等待finally
阻止,但这应该不会造成任何问题?
问题是:如果我们还没有准备好并提前退出,任务会发生什么?
没有什么。该代码忽略该任务,因此该任务被忽略。
它抛出的任何异常都会被 SynchronizationContext 重新抛出吗?
不。它们将(最终)被传递给TaskScheduler.UnobservedTaskException
然后被忽略。
如果任务正常完成,是否会出现问题,因为没有人消耗它的值?
Nope.
后续:有没有一种巧妙的方法来确保等待任务?
No.
是否可以使用finally块来等待任务并重新抛出潜在的异常?
是的,如果你的代码实际上await
这是任务。据推测,这意味着将任务保存在某个地方。
如果任务正常完成,它将在finally块中再次等待,但这不会导致任何问题吗?
You can await
一项任务可以多次执行。
如果我们还没有准备好,我们可以简单地等待任务,但是如果有 50 个退出条件,这将非常乏味。
然后考虑重构您的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)