Всё про симафоры в C#

Расскажите пожалуйста всё про симафоры. Начиная с того что это такое, зачем они нужны и тд

Ну, для начала, не "сИмафоры", а "сЕмафоры"...

"Семафоры – еще одно средство синхронизации работы потоков в платформе .NET реализованное через блокировку потоков. Функциональность средства находится внутри определенного в пространстве имен System.Threading классе Semaphore. У классов Mutex и Semaphore общий базовый класс - System.Threading.WaitHandle, поэтому их реализации схожи, ровно, как и использование. Разница в том, что мьтексы используются для ограничения доступа к ресурсу единовременно одним потоком, а семафор – несколькими. Кроме того, семафор задает максимальное количество потоков, которые могут получить доступ к ресурсу одновременно. В контексте платформы семафоры часто используются для создания синхронизации для пула ресурсов." - https://brainoteka.com/blogs/c-spravochnik/semafori

Вот пример кода с использованием семафоров:

using System;
using System.Threading;

public class Example
{
// Семафор, который имитирует пул ресурсов.
private static Semaphore ResPool;

// Введем интервал, который позволит увеличить время работы каждого потока, для внутренней работы. Поскольку наши ничего не делаю, кроме просьбы семафором.
private static int ExtTime;

public static void Main()
{
    // Создаем семафор с максимумов в три потока и текущим значением 0. Это основные потоки, поскольку запускаются из точки доступа в приложение.
    ResPool = new Semaphore(0, 3);

    // Создаем и запускаем пять потоков. Пусть поборются.
    for(int i = 1; i <= 5; i  )
    {
        Thread thd = new Thread(new ParameterizedThreadStart(BlockResMethod));

        // Запуск потока, соответствующего номеру цикла.
        thd.Start(i);
    }

    // Ждем полсекунды, чтобы дать потокам запуститься и заблокируем семафор.
    Thread.Sleep(500);

    // Три потока теперь получили доступ к семафору. Вызовем для них Release, чтобы освободить семафор.
    Console.WriteLine("Вызываем метод Release c параметром – 3 для трех активных потоков.");
    ResPool.Release(3);

    Console.WriteLine("Потоки освободили Семафор.");
}

private static void BlockResMethod(object obj)
{
    // Каждый запуск этого метода требует для себя семафор.
    Console.WriteLine("Поток №{0} начался "  
        "и ждет семафора.", obj);
    _pool.WaitOne();

    // Увеличенный интервал работы каждого потока.
    int ExtTime = Interlocked.Add(ref ExtTime, 100);

    Console.WriteLine("Поток № {0} получил семафор.", obj);

    //Каждый поток выполняется меньше чем за секунду, поскольку реализации почти не содержит. Увеличим время работы, с помощью объявленного нами ранее интервала ожидания. 
    
    Thread.Sleep(1000   ExtTime);

    Console.WriteLine("Поток№ {0} Освободил самафор.", obj);
    Console.WriteLine("Поток № {0} Предпоследнее значение счётчика семафора: {1}",
        obj, ResPool.Release());
}

}

А вообще просмотрите видеокурс C# Professional от Александра Шевчука. Он там раскрывал тему параллельного и асинхронного программирования, и затрагивал такие объекты как семафоры и мьютексы.