If I have a list of tasks which I want to execute together but at the same time I want to execute a certain number of them together, so I await for one of them until one of them finishes, which then should mean awaiting should stop and a new task should be allowed to start, but when one of them finishes, I don't know how to stop awaiting for the task which is currently being awaited, I don't want to cancel the task, just stop awaiting and let it continue running in the background.

I have the following code

```
foreach (var link in SharedVars.DownloadQueue)
{
    if (currentRunningCount != batch)
    {
        var task = DownloadFile(extraPathPerLink, link, totalLen);
        _ = task.ContinueWith(_ =>
        {
            downloadQueueLinksTasks.Remove(task);
            currentRunningCount--;
            // TODO SHOULD CHANGE WHAT IS AWAITED
        });
        currentRunningCount++;
        downloadQueueLinksTasks.Add(task);
    }

    if (currentRunningCount == batch)
    {
        // TODO SHOULD NOT AWAIT 0
        await downloadQueueLinksTasks[0];
    }
}

```

I found about `Task.WhenAny` but from [this comment](https://stackoverflow.com/a/41427636/6877477) here I understood that the other tasks will be ignored so it's not the solution I want to achieve.

I'm sorry if the question is stupid or wrong but I can't seem to find any information related on how to solve it, or what is the name of the operation I want to achieve so I can even search correctly.

Solution Edit
-------------

**All the answers provided are correct**, I accepted the one I decided to use but still all of them are correct.

Thank you everyone, I learned a lot from all of you from these different answers and different ways to approach the problem and how to think about it.

What I learned about this specific problem was that I still needed to await for the other tasks left, so the solution was to have the `Task.WhenAny` inside the loop (which returns the finished task (this is also important)) **AND** `Task.WhenAll` outside the loop to await the other left tasks.