Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Created April 9, 2015 23:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fhernd/05abb07d33af76e21a84 to your computer and use it in GitHub Desktop.
Save Fhernd/05abb07d33af76e21a84 to your computer and use it in GitHub Desktop.
Demostración de uso de la clase SemaphoreSlim en C#.
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();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment