Here is how I would approach it...
int taskCount = 1000 ;
int completedCount = 0;
Random rand = new Random();
Task[] tasks = new Task[taskCount];
for (int i = 0; i < taskCount; i++)
{
tasks[i] = DoLongTask(5000 + rand.Next(1000, 3000));
}
while (completedCount < taskCount)
{
Task completed = await Task.WhenAny(tasks);
completedCount = tasks.Count(x => x.IsCompleted || x.IsFaulted || x.IsCanceled);
}
Console.WriteLine("Done!");
Console.ReadKey();
async Task DoLongTask(int delay)
{
await Task.Yield();
await Task.Delay(delay);
}