Feat Skeleton Table de Carga - Fix Freno del Proceso al Cerrar Web
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user