Как можно реализовать ограничение на одновременное скачивание файлов?

Для реализации ограничения на одновременное скачивание файлов в C# можно использовать механизм управления потоками или задачами.

Один из способов - использовать семафор, который позволит задать максимальное количество одновременно выполняющихся операций скачивания. Вот пример использования семафора для ограничения на одновременное скачивание файлов:

using System;
using System.Net;
using System.Threading;

class Downloader
{
    private static Semaphore semaphore = new Semaphore(2, 2); // Максимальное количество одновременных скачиваний

    public static void DownloadFile(string url)
    {
        semaphore.WaitOne(); // Захватываем разрешение
        Console.WriteLine($"Downloading file from: {url}");

        WebClient client = new WebClient();
        client.DownloadFile(url, $"downloaded_{Guid.NewGuid()}.txt");

        Console.WriteLine($"Download complete from: {url}");

        semaphore.Release(); // Освобождаем разрешение
    }
}

class Program
{
    static void Main()
    {
        Thread t1 = new Thread(() => Downloader.DownloadFile("https://example.com/file1.txt"));
        Thread t2 = new Thread(() => Downloader.DownloadFile("https://example.com/file2.txt"));
        Thread t3 = new Thread(() => Downloader.DownloadFile("https://example.com/file3.txt"));

        t1.Start();
        t2.Start();
        t3.Start();

        t1.Join();
        t2.Join();
        t3.Join();
    }
}

В данном примере мы создаем семафор с максимальным количеством одновременных операций скачивания (2). Метод DownloadFile ограничивается с помощью семафора, захватывая разрешение до начала скачивания и освобождая его после завершения. Таким образом, не более двух операций скачивания могут выполняться параллельно.