The first design is more readable. You clearly state that you intend to wait for the completion of all tasks before obtaining results. I find it reasonable enough to use this instead of the second.
Also write less if you add a third or fourth task ... That is:
await Task.WhenAll(task1, task2, task3, task4);
compared with:
var result1 = await task1; var result2 = await task2; var result3 = await task3; var result4 = await task4;
source share