In this code:
private async void button1_Click(object sender, EventArgs e) { try { await Task.WhenAll(DoLongThingAsyncEx1(), DoLongThingAsyncEx2(
You're thinking of Task.WaitAll - it throws an AggregateException.
Task.WaitAll
AggregateException
WhenAll just throws the first exception of the list of exceptions it encounters.