Q:

DownloadFileTaskAsync downloads only 2 files at a time

I have implemented the code from the below thread, however I see that all the files starts to download but only 2 files downloads at a time
Asynchronously and parallelly downloading files
private static async Task<Tuple<string, string, Exception>> DownloadFileTaskAsync(string remotePath, string localPath = null, int timeOut = 3000)
        {
            try
            {

                localPath = localPath + remotePath.Split('/')[5].ToString();

                using (var client = new WebClient())
                {
                    client.Credentials = new NetworkCredential("user", "password");

                    using (var timer = new Timer(timerCallback, client, timeOut, Timeout.Infinite))
                    {
                        await client.DownloadFileTaskAsync(remotePath, localPath);
                    }
                    Debug.WriteLine(string.Format("DownloadFileTaskAsync (downloaded): {0}", remotePath));
                    return new Tuple<string, string, Exception>(remotePath, localPath, null);
                }
            }
            catch (Exception ex)
            {
                return new Tuple<string, string, Exception>(remotePath, null, ex);
            }
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            IEnumerable<string> enumerable = new string[] {"https://somepath.com/file1.zip" };
            var results = new List<Tuple<string, string, Exception>>();
            await enumerable.ForEachAsync(s => DownloadFileTaskAsync(s, "C:\\Download\\", 10000), (url, t) => results.Add(t));

        }

    }

    public static class Extensions
    {
        public static Task ForEachAsync<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, Task<TResult>> taskSelector, Action<TSource, TResult> resultProcessor)
        {
            var oneAtATime = new SemaphoreSlim(5, 10);
            return Task.WhenAll(
                from item in source
                select ProcessAsync(item, taskSelector, resultProcessor, oneAtATime));
        }

        private static async Task ProcessAsync<TSource, TResult>(TSource item, Func<TSource, Task<TResult>> taskSelector, Action<TSource, TResult> resultProcessor, SemaphoreSlim oneAtATime)
        {
            TResult result = await taskSelector(item);
            await oneAtATime.WaitAsync();
            try
            {
                resultProcessor(item, result);
            }
            finally
            {
                oneAtATime.Release();
            }
        }
    }

A:

This is because 2 is the default number of concurrent connections allowed by ServicePointManager.
The solution is simple:
System.Net.ServicePointManager.DefaultConnectionLimit = 10; // Whatever you want it to be

