Рассмотрим следующий пример:
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, но это не должно вызывать никаких проблем?