using System; using System.Threading; namespace Recetas.Multithreading.R0203 { public sealed class AccesoBaseDatosConSemaphoreSlim { // Creación de instancia de `SemaphoreSlim` para controlar el // límite de threads = 4: public static SemaphoreSlim _ss = new SemaphoreSlim(4); public static void Main() { Console.Title = "=== Demostración Uso SemaphoreSlim ==="; Console.WriteLine(); // Creación de 6 threads: for (int i = 1; i <= 6; ++i) { string nombreThread = String.Format("T{0}", i.ToString()); int tiempoEspera = 2 + 2 * i; Thread nuevoThread = new Thread( () => AccederBaseDatos(nombreThread, tiempoEspera)); // Inicio de ejecución de thread: nuevoThread.Start(); } Console.WriteLine(); } // Método que simula el control del acceso concurrente de threads // a una base de datos: public static void AccederBaseDatos(string nombreThread, int segundos) { Console.WriteLine ("Thread `{0}` debe espear para acceder a la base de datos.", nombreThread); _ss.Wait(); Console.WriteLine ("Thread `{0}` tiene ahora acceso a la base de datos.", nombreThread); // Simula operaciones transaccionales o de consulta sobre la base de datos: Thread.Sleep(TimeSpan.FromSeconds(segundos)); Console.WriteLine("Thread `{0}` ha finalizado su ejecución", nombreThread); // Continua la ejecución: _ss.Release(); } } }