Consider this example:
var task = DoSomething()
bool ready = await DoSomethingElse();
if (!ready)
return null;
var value = await DoThirdThing(); // depends o
The question: What happens to task if we're not ready and exit early?
Nothing. The code ignores the task, so the task is ignored.
Will any exceptions that it throws be re-thrown by a SynchronizationContext?
No. They will (eventually) be passed to TaskScheduler.UnobservedTaskException
and then ignored.
Are there problems if task completes normally, as nobody consumes its value?
Nope.
Follow-up: Is there a neat way to make sure task is awaited?
No.
Could a finally block be used to await task and re-throw potential exceptions?
Yes, if your code actually await
s the task. Presumably this would mean saving the task somewhere.
If task completed normally it would be awaited again in the finally block, but that shouldn't cause any problems?
You can await
a task as many times as you like.
We could simply await task if we are not ready, however if there were 50 exit conditions this would be very tedious.
Then consider restructuring your code.