Рассмотрим следующий пример:
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
, поскольку DoThirdThing
зависит от DoSomethingElse
, и мы также не хотим ждать DoSomething
, потому что мы хотим, по возможности, вызывать другие два метода.
Вопрос: Что происходит с task
, если мы не ready
и выходим раньше?
Будут ли какие-либо исключения, которые он выбрасывает, перебрасывают с помощью SynchronizationContext
?
Существуют ли проблемы, если task
завершается нормально, поскольку никто не потребляет его значение?
Последующее наблюдение: Есть ли опрятный способ убедиться, что task
ожидает?
Мы могли бы просто await task
, если бы мы не были ready
, однако если бы было 50 условий выхода, это было бы очень утомительно.
Может ли блок finally
использоваться для await task
и повторно выбрасывать потенциальные исключения? Если task
закончен нормально, он будет снова ожидаться в блоке finally
, но это не должно вызывать никаких проблем?