How it works
Await can express a real data dependency. The second operation here needs the first operation’s result, so it starts only after that value is available. Writing the awaits in order makes this relationship obvious. There is no benefit to pretending dependent work is independent: the later call cannot calculate the correct result without its input. Small async methods should return values rather than write intermediate output whenever possible, allowing a caller to compose them.
Avoid using Result or Wait to force a task into a synchronous shape; propagate asynchronous completion through the call chain instead.
Add a third operation that adds one and await it after doubling. Trace the values through the chain, then identify which operations would have to change if the first result were different.
A working example
using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
var start = await LoadAsync();
var doubled = await DoubleAsync(start);
Console.WriteLine(doubled);
async Task<int> LoadAsync() { await Task.Delay(1); return 4; }
async Task<int> DoubleAsync(int value) { await Task.Delay(1); return value * 2; }
Expected output
8
Start dependent work when the value it requires is available.