q1) so if getStringTask complets before await then how could/should i write this code ?
You've asked a great question about the timing of the HTTP request and the independent work!
If I understand correctly, you're curious about what happens if the HTTP request finishes before the DoIndependentWork() method is done.
Here's the key: with async and await, you simply don't know the exact moment an asynchronous task (like getStringTask) will complete. It could finish very quickly, even before your independent work is done, or it could take longer.
The line string contents = await getStringTask; is crucial. It acts as a synchronization point. Regardless of when getStringTask actually finishes, the await keyword ensures that:
Your DoIndependentWork() can run concurrently while getStringTask is fetching data.
The code will pause execution at await getStringTask only if getStringTask hasn't completed yet.
Once getStringTask does complete (whether it was before or after DoIndependentWork()), the value of contents will be assigned, and the method will resume execution from that point.
Think of await as setting a "bookmark" in your code. You tell the program, "Start this task, go do other things (DoIndependentWork()), but when this specific task is done, come back to this bookmark and pick up right here."
Therefore, the original code structure handles this scenario correctly. There's no need to change the reference code because the await keyword inherently manages the dependency on the getStringTask's completion.