Расскажите пожалуйста всё про симафоры. Начиная с того что это такое, зачем они нужны и тд
Ну, для начала, не "сИмафоры", а "сЕмафоры"...
"Семафоры – еще одно средство синхронизации работы потоков в платформе .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 от Александра Шевчука. Он там раскрывал тему параллельного и асинхронного программирования, и затрагивал такие объекты как семафоры и мьютексы.