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