Feat Skeleton Table de Carga - Fix Freno del Proceso al Cerrar Web

This commit is contained in:
2025-10-29 14:16:57 -03:00
parent 66e3a0af99
commit e41892ef2d
4 changed files with 128 additions and 22 deletions

View File

@@ -1,12 +1,30 @@
// backend/src/Titulares.Api/Hubs/TitularesHub.cs
using Microsoft.AspNetCore.SignalR;
using Titulares.Api.Services;
namespace Titulares.Api.Hubs;
// Esta clase es el punto de conexión para los clientes de SignalR.
// No necesitamos añadirle métodos personalizados porque solo enviaremos
// mensajes desde el servidor hacia los clientes.
public class TitularesHub : Hub
{
private readonly EstadoProcesoService _estadoService;
public TitularesHub(EstadoProcesoService estadoService)
{
_estadoService = estadoService;
}
// Este método se ejecuta CADA VEZ que un nuevo cliente (pestaña) se conecta.
public override Task OnConnectedAsync()
{
_estadoService.RegistrarConexion();
return base.OnConnectedAsync();
}
// Este método se ejecuta CADA VEZ que un cliente (pestaña) se desconecta.
public override Task OnDisconnectedAsync(Exception? exception)
{
_estadoService.RegistrarDesconexionYApagarSiEsElUltimo();
return base.OnDisconnectedAsync(exception);
}
}

View File

@@ -1,12 +1,11 @@
// backend/src/Titulares.Api/Services/EstadoProcesoService.cs
namespace Titulares.Api.Services;
public class EstadoProcesoService
{
private volatile bool _estaActivo = false;
private volatile int _connectionCount = 0;
private readonly object _lock = new object();
// 1. Definimos un evento público al que otros servicios pueden suscribirse.
public event Action? OnStateChanged;
public bool EstaActivo() => _estaActivo;
@@ -14,14 +13,38 @@ public class EstadoProcesoService
public void Activar()
{
_estaActivo = true;
// 2. Disparamos el evento para notificar a los suscriptores.
OnStateChanged?.Invoke();
}
public void Desactivar()
{
_estaActivo = false;
// 3. Disparamos el evento también al desactivar.
OnStateChanged?.Invoke();
}
public void RegistrarConexion()
{
lock (_lock)
{
_connectionCount++;
}
}
public void RegistrarDesconexionYApagarSiEsElUltimo()
{
lock (_lock)
{
_connectionCount--;
// Si el contador llega a 0, significa que no hay más clientes conectados.
// Apagamos el proceso de forma segura.
if (_connectionCount <= 0)
{
_connectionCount = 0; // Prevenir números negativos
if (_estaActivo)
{
Desactivar();
}
}
}
}
}