Ответ 1
От MSDN:
Task.WhenAll<TResult>(IEnumerable<Task<TResult>>)
Это единственная перегрузка четырех, которая содержит это утверждение:
Если ни одна из задач не была выполнена, и ни одна из задач не была отменена, итоговая задача завершится в состоянии RanToCompletion. Результат возвращаемая задача будет установлена в массив, содержащий все результаты поставленных задач в том же порядке, в каком они были предоставлены(например, если массив входных задач содержит t1, t2, t3, выходная задача Результат вернет TResult [], где arr [0] == t1.Result, arr 1 == t2.Result и arr [2] == t3.Result).