add WhenAll(not tested)