Цель состоит в том, чтобы объединить несколько задач async в один, который будет завершен, когда будут выполнены все его составные задачи.
Ответ 1
Я думаю, что самая близкая вещь, встроенная в .Net 4.0, ContinueWhenAll(). Вы можете сделать continuationAction простой tasks => tasks и использовать возвращенный Task.
По соображениям производительности вы можете использовать его с TaskContinuationOptions.ExecuteSynchronously.
Ответ 2
В .NET Framework 4.0 WhenAll и WhenAny можно использовать с установленным AsyncCTP в случае Visual Studio 2010 или Async Targeting Pack в случае Visual Studio 2012.
Затем применяются методы WhenAll и WhenAny в типе TaskEx.
Ответ 3
Попробуйте подождать Task.WaitAll() в другой Задаче. Используйте метод расширения LINQ ToArray для преобразования из IEnumerable<Task> в Task[].